我想检查嵌套字段是否存在或为null。如果存在则返回该值,否则返回该字段的默认值。需要使用.aggregate
因为我还需要执行一些聚合操作。
说我的文档就像:
{
"_id" : ObjectId("581a18d41b6c5c752f11c87a"),
"email": "aa@gmail.com",
"name" : "xxxxxx",
"memberType" : "Guest",
"name" : "M1",
"inviter": {
"status": 'active'
}
},
{
"_id" : ObjectId("581a18d41b6c5c752f11c87b"),
//....
"name" : "M2",
"inviter": {
}
}
我希望得到像
这样的数据{
"_id" : ObjectId("581a18d41b6c5c752f11c87a"),
"data": ["M1","active"]
},
{
"_id" : ObjectId("581a18d41b6c5c752f11c87b"),
"data": ["M2","inactive"]
}
我试过了:
db.getCollection('users').aggregate([
{$match:{"email" :{$ne:'bb@gmail.com'}}},
{$sort:{_id:1}},
{$project:{
"_id" : "$_id",
"data":
["$name",
{ "$inviter.status":{$ifNull: [ "$inviter.status", 'inactive'] }},
]
}}
])
但收到错误
“errmsg”:“运营商无效 '$ inviter.status”',
是否可以使用$ifNull
检查嵌套字段,或者我该如何解决这个问题?
答案 0 :(得分:1)
是我的坏事。应该是{$ifNull: [ "$inviter.status", 'inactive'] }
而不是{ "$inviter.status":{$ifNull: [ "$inviter.status", 'inactive'] }}
解决了:
db.getCollection('users').aggregate([
{$match:{"email" :{$ne:'bb@gmail.com'}}},
{$sort:{_id:1}},
{$project:{
"_id" : "$_id",
"data":
["$name",
{$ifNull: [ "$inviter.status", 'inactive'] },
]
}}
])