【问题标题】:Return null default value if no result found如果未找到结果,则返回 null 默认值
【发布时间】:2019-04-12 02:57:41
【问题描述】:

我有一个如下所示的集合:

{  
"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 }

我该怎么做?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    如果结果==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};
        }
    });
    

    【讨论】:

    • 谢谢,我试过了,但什么也没有出现,所以我尝试打印(结果)但仍然没有...
    【解决方案2】:

    你可以使用下面的聚合

    如果查询中没有找到$matched 数据,Mongodb 不会产生结果。

    但是您可以使用$facet 聚合,它在单个阶段内处理多个聚合管道。

    所以首先使用$facet 获取$matched 文档,如果没有找到($ifNull)数据,则使用$projection。

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

    【讨论】:

    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 2013-02-25
    • 2016-09-01
    • 2020-02-05
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    相关资源
    最近更新 更多