如何在MongoDB中查找文档中所有键的计数空字段?

时间:2019-06-16 08:33:59

标签: mongodb aggregation-framework

我在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上运行查询并创建仪表板,并且它仅支持这样的结果)

1 个答案:

答案 0 :(得分:0)

您希望将$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" }