Булево существование объекта проекта в MongoDB - PullRequest
2 голосов
/ 31 января 2020

У меня есть структура документа, которая выглядит следующим образом (два примера документа ниже).

{
  "A": "value"
},
{
  "A": "value",
  "B": {
    "a": "value",
    "b": "value"
  }
}

Я хочу агрегировать так, чтобы значение поля A проецировалось, а значение true/false возвращалось в зависимости от того, существует ли объект B. Результат запроса будет:

{
  "A": "value",
  "B": false
},
{
  "A": "value",
  "B": true
}

Ответы [ 3 ]

2 голосов
/ 31 января 2020

Вы можете использовать оператор $ type :

Если аргумент является полем, отсутствующим во входном документе, $ type возвращает строку «missing».

db.collection.aggregate([
  {
    $project: {
      A: 1,
      B: {
        $ne: [
          {
            $type: "$B"
          },
          "missing"
        ]
      }
    }
  }
])

MongoPlayground

2 голосов
/ 31 января 2020

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

db.collection.aggregate([
  { "$addFields": {
    "B": {
      "$cond": [
        { "$eq": ["$B", undefined] },
        false,
        true
      ]
    }
  }}
])
1 голос
/ 31 января 2020

Даже более короткое решение:

db.collection.aggregate({
   $project: {
      A: 1,
      B: { $cond: ["$B", true, false] }
   }
})

или

db.collection.aggregate({
   $project: {
      A: 1,
      B: { $ifNull: [{ $toBool: "$B" }, false] }
   }
})

Однако следующие документы дадут другой результат, чем другие ответы. Проверьте вашу заявку, если такие документы применяются.

{
   'A': 'value5',
   'B': false
},    
{
   'A': 'value5',
   'B': []
}
...