Возвращает нулевое значение по умолчанию, если результат не найден - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть коллекция, которая выглядит так:

{  
"value" : "20",
"type" : "square",
"name" : "form1"
}
{
"value" : "24",
"type" : "circle",
"name" : "form2"
}
{
"value" : "12",
"type" : "square",
"name" : "form3"
}

Я хочу извлечь документ с помощью name = form2, поэтому я набираю:

db.myCollec.find({"name":"form2"} , {"name":1, "type":1, "_id":0})

Результат:

{ "name" : "form2", "type" : "circle" }

Теперь, если я хочу найти документ с name = form4, я набираю:

db.myCollec.find({"name":"form4"} , {"name":1, "type":1, "_id":0})

Но это ничего не возвращает, потому что нет документа с таким именем.

Однако я хочу, чтобы возвращаемое значение выглядело так:

{ "name" : "form4", "type" : null }

Как бы я это сделал?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Почему вы не проверяете обратный вызов, если result == null, и создаете свой собственный пустой объект?

let name = "form4";
db.myCollec.find({"name":name} , {"name":1, "type":1, "_id":0}, function(err, result){
    if(err) {
         // Error handling
         return;
    }
    if (result==null){
        result = {"name":name, "type":null};
    }
});
0 голосов
/ 08 ноября 2018

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

Mongodb не выдает результат, если в запросе не найдено $match данных.

Но вы можете использовать агрегирование $facet, которое обрабатывает несколько конвейеров агрегации в пределах одной стадии.

Итак, сначала используйте $facet, чтобы получить $match ed документов и используйте $project ион, если не найдено данных ($ifNull).

let searchTerm = "form2"

db.myCollec.aggregate([
  { "$facet": {
    "data": [
      { "$match": { "name": searchTerm  }},
      { "$project": { "name": 1, "type": 1, "_id": 0 }}
    ]
  }},
  { "$project": {
    "name": {
      "$ifNull": [{ "$arrayElemAt": ["$data.name", 0] }, searchTerm ]
    },
    "type": {
      "$ifNull": [{ "$arrayElemAt": ["$data.type", 0] }, null]
    }
  }}
])
...