忽略MongoDB查询结果中的空字段

时间:2019-11-07 11:26:14

标签: mongodb

是否有一种方法可以从MongoDB查询结果的文档(查找或汇总)中忽略空白字段(例如,空字符串或空数组)。

数据库中的文档

{
    "_id" : ObjectId("5dc3fcb388c1c7c5620ed496"),
    "name": "Bill",
    "emptyString" : "",
    "emptyArray" : []
}

输出:

{
    "_id" : ObjectId("5dc3fcb388c1c7c5620ed496"),
    "name": "Bill"
}

Elasticsearch的类似问题:Omit null fields from elasticsearch results

2 个答案:

答案 0 :(得分:0)

请使用聚合函数。 如果要删除密钥。您可以通过$ project使用$ cond。

db.Speed.aggregate( [
   {
      $project: {
         name: 1,
         "_id": 1,
         "emptyString": {
            $cond: {
               if: { $eq: [ "", "$emptyString" ] },
               then: "$$REMOVE",
               else: "$emptyString"
            }
         },
         "emptyArray": {
            $cond: {
               if: { $eq: [ [], "$emptyArray" ] },
               then: "$$REMOVE",
               else: "$emptyArray"
            }
         }
      }
   }
] )

答案 1 :(得分:0)

可以做到这一点的一种方法是使用find()aggregation([])都可以使用的cursor.map()

这个想法是获取存在的/可能存在于文档中的字段列表,并使用delete运算符删除字段(它们是空字符串或空数组,都具有length属性)

Mongo Shell:

var fieldsList = ["name", "emptyString", "emptyArray"];

db.collection.find().map(function(d) {
  fieldsList.forEach(function(k) {
    if (
      k in d &&
      (Array.isArray(d[k]) ||
        (typeof d[k] === "string" || d[k] instanceof String)) &&
      d[k].length === 0
    ) {
      delete d[k];
    }
  });
  return d;
});

测试文档:

{
  "_id" : ObjectId("5dc426d1f667120607ac5006"),
  "name" : "Bill",
  "emptyString" : "",
  "emptyArray" : [ ]
}
{
  "_id" : ObjectId("5dc426d1f667120607ac5007"),
  "name" : "Foo",
  "emptyString" : "foo",
  "emptyArray" : [ ]
}
{
  "_id" : ObjectId("5dc426d1f667120607ac5008"),
  "name" : "Bar",
  "emptyString" : "",
  "emptyArray" : [
          "foo",
          "bar"
  ]
}
{
  "_id" : ObjectId("5dc426d1f667120607ac5009"),
  "name" : "May",
  "emptyString" : "foobar",
  "emptyArray" : [
          "foo",
          "bar"
  ]
}

O / P

[
        {
                "_id" : ObjectId("5dc426d1f667120607ac5006"),
                "name" : "Bill"
        },
        {
                "_id" : ObjectId("5dc426d1f667120607ac5007"),
                "name" : "Foo",
                "emptyString" : "foo"
        },
        {
                "_id" : ObjectId("5dc426d1f667120607ac5008"),
                "name" : "Bar",
                "emptyArray" : [
                        "foo",
                        "bar"
                ]
        },
        {
                "_id" : ObjectId("5dc426d1f667120607ac5009"),
                "name" : "May",
                "emptyString" : "foobar",
                "emptyArray" : [
                        "foo",
                        "bar"
                ]
        }
]

注意:如果文档中的字段数量很大,这可能不是最佳解决方案,因为将对文档中的所有字段进行比较。您可能想用怀疑为空数组或字符串的属性对fieldsList进行分块。