MongoDB - Проверить, существует ли ключ в массиве объекта - PullRequest
2 голосов
/ 19 сентября 2019

У меня есть коллекция 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
            ]
          }
        }
      }
    ])

Я не могу использовать $exists внутри $ cond.Я тоже попробовал $ifNull.Нужны ваши мысли по этому поводу.

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

Вы можете использовать ниже агрегации

db.collection.aggregate([
  { "$project": {
    "OrderExists": {
      "$cond": [{ "$ne": [{ "$ifNull": [{ "$arrayElemAt": ["$orderDetails.movieName", 0] }, null] }, null] }, 1, 0]
    }
  }}
])
0 голосов
/ 19 сентября 2019

Следующий запрос может дать нам ожидаемый результат:

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
}
0 голосов
/ 19 сентября 2019

Вы пытались использовать проверку типа, чтобы найти нулевые значения с {$ type: 10}?
Непосредственно из документации :

Проверка типа

Запрос {item: {$ type: 10}} соответствует только документам, которые содержат поле элемента со значением null;то есть значение поля элемента имеет тип BSON Нуль (тип номер 10):

...