在$ Project阶段向子文档添加新字段

时间:2018-01-02 06:56:59

标签: node.js mongodb mongoose aggregation-framework

我正在选择一个文档并希望修改内部子文档但显示错误

  

{MongoError:无法为lastCheckin的子字段添加表达式   因为已经存在适用于整个字段的表达式

var req = { user : {id : ObjectId("5a03f9a0fafa645c8a39934c")}}
User.aggregate([
    {
        $match:{
            _id: ObjectId(req.user.id)
        }
    },
    {
        $lookup:{
         from: 'status',
         localField: 'lastCheckin._id',
         foreignField: '_id',
         as: 'checkin'
        }
    },
    {
        $project : {    
            name:1,
            lastCheckin: { $arrayElemAt:[ "$checkin",0]},
            "lastCheckin.isLiked": {$literal:1}
        }
    },
])
.exec((err,results)=>{
    console.dir({
        err:err,
        results:JSON.stringify(results)
    });
})

而lastCheckin为空/ null或

{
 "_id" : ObjectId("5a44e37fb746931a585dd62c"),
    likes: [ObjectId("5a44e37fb746931a585dd62c"), ...]
...
},

注意:$ lookup按预期工作,我得到lastChecin但我不允许在lastCheckin中添加isLiked键

1 个答案:

答案 0 :(得分:1)

不幸的是,不可能按照3.2版本的方式进行操作。

您必须输出已加入文档中的所有投影字段以及添加新字段。

这样的东西
{"$project":{
  "name":1,
  "lastCheckin":{
    "$let":{
      "vars":{"lastCheckin":{"$arrayElemAt":["$checkin",0]}},
      "in":{
        "otherfield1":"$$lastCheckin.otherfield1",
        "otherfield2":"$$lastCheckin.otherfield2", 
        "isLiked":{"$literal":1}
      }
    }
  }
}}

3.6解决方案:

{"$project":{
  "name":1,
  "lastCheckin":{
    "$mergeObjects":[
      {"$arrayElemAt":["$checkin",0]},
      {"isLiked":{"$literal":1}}
    ]
  }
}}

3.4解决方案

{"$project":{
  "name":1,
  "lastCheckin":{"$arrayElemAt":["$checkin",0]},
}},
{"$addFields":{"lastCheckin.isLiked":{"$literal":1}}}