我正在选择一个文档并希望修改内部子文档但显示错误
{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键
答案 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}}}