MongoDB: нулевая проверка между этапами конвейера - PullRequest
1 голос
/ 11 апреля 2019

Если я создаю коллекцию следующим образом:

db.People.insert({"Name": "John"})

и запускаю простой агрегат Монго, например, так:

db.People.aggregate([{$match: {Name: "John"}}, {$group: {_id: "null", count: {$sum: 1}}}])

Это подсчитывает всех Джонов в коллекции и возвращает это

{ "_id" : "null", "count" : 1 }

Что приятно.Но если я ищу имя "Clarice", которое вообще не существует, оно возвращает null.

Я хотел бы, чтобы он вернулся

{ "_id" : "null", "count" : 0 }

Я не нашел способа достичь этого.Я должен был бы включить какую-то проверку на ноль между $match - и $group - этапом.

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

Просто используйте count

db. People.count({Name:"John"}) Это вернет точное число.

В противном случае вам нужно проверить результат, если это пустой массив. Ниже приведен код для узла, использующего loopback,

db.People.aggregate([
{$match: {Name: "John"}}, 
 {$group: {_id: "null", count: {$sum: 1}}}
],(err,res)=>{
 if(err) return cb(err)
 if(res.length) return cb(err,res)
 else return cb(err,{_id:null,count:0})
})
1 голос
/ 13 апреля 2019

Необходимо использовать агрегацию $ facet вместе с оператором $ ifNull .Например:

db.People.aggregate([
  { "$facet": {
    "array": [
      { "$match": { Name:"John" }},
      { "$group": {
    "_id": null,
    "count": { "$sum": 1 }
      }},
      { "$project": { "_id": 0, "count": 1 }}
    ]
  }},
  { "$project": {
    "count": {
      "$ifNull": [{ "$arrayElemAt": ["$array.count", 0] }, 0 ]
    }
  }}
])

Вывод:

{ "count" : 1 }

Для другого имени оно должно быть следующим:

{ "count" : 0 }

Аналогично и в $ addFields когда$ совпадение не найдено

0 голосов
/ 11 апреля 2019

Вы можете использовать $ ifNull на этапе $ match.

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

Редактировать: если вы группируете по Имени, результат для "Джона" равен единице, поскольку "Клариса" является пустым правильным массивом, здесь запрос агрегации:

db.People.aggregate([
    { 
        $match: { Name: "John" } 

    }, 
    { 
        $group: { _id: "$Name", count: { $sum: 1 } } 
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...