MongoDB 在设置活动键时聚合并保留所有值

MongoDB Aggregate and keep all values while setting an active key

我想要 return 从 "Items" 编辑的所有值,当有匹配项时,我希望 "isActive" 为真。

exports.listUserItems = function (req, res) {

  // Aggregate results
  User.aggregate([{
      "$match": {
          "username": req.params.username
      }
  }, {
      "$lookup": {
          "from": "Items",
          "localField": "itemIds",
          "foreignField": "_id",
          "as": "items"
      }
  }, {
      "$unwind": {
          "path": "$items"
      }
  }, {
      "$project": {
          "item": "$items.item_name",
          "isActive": '1',
          "_id": 0
      }
  }], (err, result) => res.json(result));
};

完成此任务的最佳方法是什么?

我打算分别 return 所有项目和用户项目,然后比较它们并 object.value 它们等等......这似乎有点过分了。可以在模型端完成吗?

我无法 post 文档结构,因为 Whosebug 不允许,但你应该明白了。

编辑:

用户文档

{
    "username" : "anonuser",
    "items" : [ 
        ObjectId("5ba8345f1e56fe8e6caaaa07"), 
        ObjectId("5ba706d64e82292e72e9ae71")
    ]
}

然后我有一个 "Items" 集合,其中有 3 个这样的文档。

{
    "_id" : ObjectId("5ba706d64e82292e72e9ae71"),
    "item_name" : "Salary"
}

我的预期 json api 输出是。

[{"_id":"5ba706d64e82292e72e9ae71","item_name":"Salary","isActive":true},{"_id":"5ba8345f1e56fe8e6caaaa07","item_name":"Fulltime","isActive":true},{"_id":"5ba9af6c1e56fe8e6cab521e","item_name":"Advisor","isActive":false}]

您可以尝试以下聚合

Items.aggregate([
  { "$lookup": {
    "from": "users",
    "let": { "itemsId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$in": ["$$itemsId", "$items"] }}},
      { "$project": { "isActive": { "$literal": true }}}
    ],
    "as": "items"
  }},
  { "$addFields": {
    "isActive": {
      "$ifNull": [{ "$arrayElemAt": ["$items.isActive", 0] }, { "$literal": false }]
    }
  }},
  { "$project": { "items": 0 }}
])