使用条件向嵌套数组添加键

时间:2018-06-11 17:12:21

标签: node.js mongodb mongodb-query aggregation-framework

我在mongodb中有一个简单的数据结构:

{
  _id: ObjectID,
 name: 'Name',
 birthday: '25.05.2001'
 items: [
          {
             _id: ObjectID,
             name: 'ItemName',
             info: 'ItemInfo',
           },
           {
             _id: ObjectID,
             name: 'ItemName',
             info: 'ItemInfo',
           }
        ]
}

现在我想要一个查询,它将一个项目的ObjectID(_id)作为条件,并让我返回包含数组中所有项目的对象并投影一个新字段" selected"将值true或false放入每个数组项结果的字段中:

我用这个查询试过了:

 { $unwind: '$items' },
 {
    $project: {
       selected: {
          $cond: { if: { 'items._id': itemObjectID }, then: true, else: false },
      },
    },
  },    

但是MongoDB给了我一个错误:

MongoError: FieldPath field names may not contain '.'.

不知道为什么它不起作用,没有任何帮助或想法?非常感谢你!

2 个答案:

答案 0 :(得分:1)

这里缺少的是$eq聚合运算符,它检查条件是否相等。

如果您想检查ObjectId,则可以在此处尝试以下聚合,然后您需要mongoose.Types.ObjectId(_id)

db.collection.aggregate([
  { "$unwind": "$items" },
  { "$addFields": {
    "items.selected": {
      "$eq": [
        1111,
        "$items._id"
      ]
    }
  }},
  { "$group": {
    "_id": "$_id",
    "name": { "$first": "$name" },
    "items": {
      "$push": {
        "_id": "$items._id",
        "selected": "$items.selected"
      }
    }
  }}
])

将提供以下输出

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "items": [
      {
        "_id": 1111,
        "selected": true
      },
      {
        "_id": 2222,
        "selected": false
      }
    ],
    "name": "Name"
  }
]

您可以查看here

答案 1 :(得分:0)

@Ashish:非常感谢你的帮助!您的回答帮助我为我构建了正确的查询:

  db.collection.aggregate([
  {
    $unwind: "$items"
  },
  {
    $project: {
      "items.name": 0,
      "birthday": 0
    }
  },
  {
    "$addFields": {
      "items.selected": {
        "$eq": [
          1111,
          "$items._id"
        ]
      }
    }
  },
  {
    $group: {
      _id: "$_id",
      "name": {
        "$first": "$name"
      },
      items: {
        $push: "$items"
      }
    }
  },
  {
    $match: {
      "items._id": {
        $eq: 1111
      }
    }
  },
])

并导致结果如下:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "items": [
      {
        "_id": 1111,
        "selected": true
      },
      {
        "_id": 2222,
        "selected": false
      }
    ],
    "name": "Name"
  }
]