MongoDB mongoose $ lookup不在数组中。

时间:2018-03-08 10:06:26

标签: arrays mongodb mongoose aggregate

我使用以下查询:

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,
  }
]

1 个答案:

答案 0 :(得分:1)

您可以在3.6版本中使用$mergeObject运算符。

$mergeObject将已加入的集合字段与其他字段合并,后跟$replaceRoot,以将合并的文档提升到最高级别。

$project并排除model字段。

$lookup

之后添加以下阶段
 [
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          {
            "$arrayElemAt": [
              "$model",
              0
            ]
          },
          "$$ROOT"
        ]
      }
    }
  },
  {
    "$project": {
      "model": 0
    }
  }
]