是否可以使用MongoDB中的$ ifNull检查$ project中的嵌套字段是否存在或为null

时间:2016-11-30 09:56:48

标签: mongodb aggregation-framework

我想检查嵌套字段是否存在或为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检查嵌套字段,或者我该如何解决这个问题?

1 个答案:

答案 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'] },
             ]
       }}
   ])