如果未找到结果,则返回空默认值

时间:2018-11-08 15:05:06

标签: mongodb mongodb-query aggregation-framework

我有一个看起来像这样的收藏集:

{  
"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 :(得分:1)

您可以使用以下汇总

如果在查询中找不到$match个数据,则Mongodb不会产生结果。

但是您可以使用$facet聚合来处理单个阶段中的多个聚合管道。

因此,首先使用$facet获取$match版本的文档,如果找不到($project)数据,则使用$ifNull ion。

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]
    }
  }}
])

答案 1 :(得分:0)

为什么如果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};
    }
});