MongoDb 4.x 使用 find 查询没有空条目的投影

MongoDb 4.x Query with projection without empty entries using find

我们现在使用 mongo-db 来存储来自测试的数据。我正在使用 Mongo-Shell 文件结构如下:

{
   static1:"abc",
   static2:"xyz",
   static3:"asd", [...],
   nested:[
   {
       data1: "d1",
       data2: "d2",
   },
   {
       data1: "dx",
       data4: "d4",
       data5: "d5",
       data6: "d6",
   },
   {
       data1: "ds",
       data8:"data8"
   }, [...]
   ]
}

所以静态数据总是在相同的结构中,但对于每次测量,对象看起来可能不同。它可以是具有上限值、下限值和实际值的电压。或者只是比较目标值和实际值。高度动态。 相同的 data1-name 代表相同的属性。

现在,例如我只想显示嵌套文档的一些静态数据和一个(或多个)属性。

我正在使用这个查询:

find({}, {_id:0, data1:1, "nested.data8":1}).pretty()

正如预期的那样,只显示了静态数据 1,但是动态测量在 shell-output

中有很多空对象

示例输出:

{ 
  "static1" : "123", 
  "nested" : [
    {  }, 
    {  }, 
    {  }, [...] ,
    { "data8" : "OK" } 
] }

所需的输出将是:

{ 
   "static1" : "123", 
   "nested" : [
         { "data8" : "d8" } 
    ] 
}

我也在 mongo shell:

上试过这个查询
aggregate( { $addFields: {"static":"$static1", "data8":"$nested.data8"} },  { $project:{"static1":1, "nested.data8":1} } ).pretty()

但是结果是一样的。 我希望有办法摆脱输出中的空文档。

谢谢

您可以尝试 $filter 运算符通过检查条件不等于空对象 {}

来过滤 nested 数组的结果
db.collection.aggregate([
  {
    $project: {
      _id: 0,
      data1: 1,
      "nested.data8": 1
    }
  },
  {
    $set: {
      nested: {
        $filter: {
          input: "$nested",
          cond: { $ne: ["$$this", {}] }
        }
      }
    }
  }
])

Playground