【问题标题】:MongoDB mongoose $lookup not in array.MongoDB mongoose $lookup 不在数组中。
【发布时间】:2018-08-16 15:31:39
【问题描述】:

我使用以下查询:

Collection
    .aggregate([
    {
        $project : { follow_count: {$size: { "$ifNull": [ "$follow_users", [] ] } } }
    },
    { $lookup: {from: 'models', localField: '_id', foreignField: '_id', as: 'model'}},
])

获取这种 JSON:

[
  {
    "_id": "1234565434567",
    "follow_count": 3,
    "model": [
      {
        "_id": "1234565434567",
        "make": "Make1",
        "name": "Model1",
        "price": 15200,
      }
    ]
  },
  {
    "_id": "123456789",
    "follow_count": 2,
    "model": [
      {
        "_id": "123456789",
        "make": "Make2",
        "name": "Model2",
        "price": 12000,
      }
    ]
  }
]

有没有办法不将 $lookup 结果推送到数组中以获得这样的 JSON? 我更喜欢在查询后不使用循环,所以我正在寻找一种优化的方式。

[
  {
    "_id": "1234565434567",
    "follow_count": 3,
    "make": "Make1",
    "name": "Model1",
    "price": 15200,
  },
  {
    "_id": "123456789",
    "follow_count": 2,
    "make": "Make2",
    "name": "Model2",
    "price": 12000,
  }
]

【问题讨论】:

  • 尝试使用 $unwind 或 $project

标签: arrays mongodb mongoose aggregate


【解决方案1】:

3.6版本可以使用$mergeObject操作符。

$mergeObject 将合并的集合字段与其他字段合并,然后$replaceRoot 将合并的文档提升到顶层。

$project 排除以删除 model 字段。

$lookup之后添加以下阶段

 [
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          {
            "$arrayElemAt": [
              "$model",
              0
            ]
          },
          "$$ROOT"
        ]
      }
    }
  },
  {
    "$project": {
      "model": 0
    }
  }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-14
    • 2019-01-21
    • 2021-06-10
    • 1970-01-01
    • 2020-09-14
    • 2021-08-25
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多