MongoDB-检查键是否存在于对象数组中

时间:2019-09-19 12:38:35

标签: mongodb mongodb-query aggregation-framework

我有以下记录的集合BookingDetails

    {
      "code" : "TICKET1234",
        "orderDetails" : [
          {
            "cost": 150.0,
            "movieName": "avengers"
          }
        ]
    },
    {
      "code" : "TICKET1235",
        "orderDetails" : [

        ]
    }

需要检查orderDetails.MovieName在投影层上是否存在。我在下面的查询中尝试过,这没有帮助。

    db.BookingDetails.aggregate([
      {
        $project: {
          OrderExists: {
            $cond: [
              { $ne: ["$orderDetails.0.movieName", null] },
              1, 0
            ]
          }
        }
      }
    ])

我不能在$ cond中使用$exists。我也尝试过$ifNull。需要您的想法。

4 个答案:

答案 0 :(得分:1)

您可以使用以下汇总

db.collection.aggregate([
  { "$project": {
    "OrderExists": {
      "$cond": [{ "$ne": [{ "$ifNull": [{ "$arrayElemAt": ["$orderDetails.movieName", 0] }, null] }, null] }, 1, 0]
    }
  }}
])

答案 1 :(得分:0)

您是否尝试过使用类型检查使用{$ type:10}查找空值?
直接来自documentation

  

类型检查

     

{item:{$ type:10}}查询仅与包含以下内容的文档匹配   值为零的项目字段;即项目字段的值   是BSON类型为Null(类型号为10):

答案 2 :(得分:0)

以下查询可以为我们提供预期的输出:

db.collection.aggregate([
  {
    $project:{
      "OrderExists":{
        $cond:[
          {
            $ne:[
              { 
                $arrayElemAt: ["$orderDetails.movieName", 0] 
              },
              undefined
            ]
          },
          1,
          0
        ]
      }
    }
  }
]).pretty()

数据集:

{
  "_id" : ObjectId("5d837db4fb35a835fbd8638f"),
  "code" : "TICKET1234",
  "orderDetails" : [
    {
      "cost" : 150,
      "movieName" : "avengers"
    }
  ]
}
{
  "_id" : ObjectId("5d837db4fb35a835fbd86390"),
  "code" : "TICKET1235",
  "orderDetails" : [ ]
}

输出:

{
  "_id" : ObjectId("5d837db4fb35a835fbd8638f"),
  "OrderExists" : 1
}
{
  "_id" : ObjectId("5d837db4fb35a835fbd86390"),
  "OrderExists" : 0
}

答案 3 :(得分:0)

在mongoshell中的另一种方法是:

db.getCollection('nestedstuff').find({'mainObj.level1.level2.level3.seekObj':{$elemMatch:{'propertyToFind':{$exists:true}}}}).count()