我正在选择一个文档并希望修改内部子文档但显示错误
{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键
不幸的是,不可能按照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}}}