簡體   English   中英

在$ Project階段將新字段添加到子文檔

[英]Add new field to sub document in $Project stage

我正在選擇一個文檔,想要修改內部子文檔,但顯示錯誤

{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為空/空或

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

注意:$ lookup可以按預期工作,我正在獲取lastChecin,但不允許在lastCheckin中添加isLiked鍵

不幸的是,無法按照您在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}}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM