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

问题描述 投票:0回答:1

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

{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键

node.js mongodb mongoose aggregation-framework
1个回答
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}}}
© www.soinside.com 2019 - 2024. All rights reserved.