【问题标题】:How to find count null fields for all keys in document in MongoDB?如何在 MongoDB 中查找文档中所有键的计数空字段?
【发布时间】:2019-06-16 18:17:25
【问题描述】:

我在 mongo 中有一个包含多个字段的集合,我需要找出所有文档中每个字段的空值数量?我还需要使用聚合管道来做到这一点。 例如,如果我的收藏是这样的:

{
   _id: 1,
   field1: 'value1',
   field2: 'value2',
   field3: null,
   field4: 'value3'
},
   _id: 2,
   field1: null,
   field2: 'value4',
   field3: null,
   field4: 'value5'
{
   _id: 3,
   field1: 'value7',
   field2: 'value8',
   field3: 'value9',
   field4: 'value10'
},
{
   _id: 4,
   field1: 'value11',
   field2: 'value12',
   field3: null,
   field4: 'value13'
}

我想得到这样的结果:

{ fieldName: 'field1', notNullCount: 3},  { fieldName: 'field2', notNullCount: 4}, { fieldName: 'field3', notNullCount: 1}, { fieldName: 'field4', notNullCount: 4}

我尝试使用投影和使用条件来计算非空值,但我得到的结果是一个以 fieldName 为键并计为值的文档,但 我需要得到一个结果每个字段的文档作为我上面的示例。

(如果你想知道我为什么需要这样的结果,因为我需要在 Metabase 上运行查询并创建仪表板,它只支持这样的结果)

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    您需要将$group_id: null 结合使用,以便能够汇总所有字段。

      { $group: {
          _id: null,
          field1: { $sum: {$cond: [{$eq: ["$field1", null]}, 0, 1] } },
          field2: { $sum: {$cond: [{$eq: ["$field1", null]}, 0, 1] } }
         }
      }
    

    获得这些文档后,您可以将它们$project 放入一个数组中,您可以通过$unwind 获得所需的格式:

    { $project: { fields: [{ fieldName: "field1", count: "$field1" }, {fieldName: "field2", count: "$field2"}] } },
    { $unwind: "$fields" }
    

    【讨论】:

    • 我要补充一点,如果您的字段值解析为 false,您应该使用 $eq null 和字段值。
    • 好电话!更新
    • 我知道这个查询,正如我所提到的,我需要每个字段有 1 个文档作为示例问题。您编写的查询只会产生一个我不想要的{field1: 1, field2: 2} 格式的文档。
    • 哦!我误解了。在这种情况下,一旦你分组,我相信你会想要$project数组中的那些行,然后$unwind他们。让我更新我的答案
    • 谢谢,投影然后放松的好主意,但这不是我想要的确切结果。 (现在每个文档都有一个带有字段名称和计数的fields 字段,它需要另一个项目才能准确)但它解决了我的问题。
    猜你喜欢
    • 2012-03-18
    • 1970-01-01
    • 2014-07-17
    • 2019-05-29
    • 2016-07-15
    • 2015-01-29
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多