【问题标题】:MongoDb 4.x Query with projection without empty entries using findMongoDb 4.x 使用 find 查询没有空条目的投影
【发布时间】:2021-07-07 13:32:31
【问题描述】:

我们现在使用 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输出中有很多空对象

示例输出:

{ 
  "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()

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

谢谢

【问题讨论】:

    标签: mongodb mongodb-query mongo-shell mongo-projection


    【解决方案1】:

    您可以尝试$filter 运算符通过检查条件不等于空对象{} 来过滤nested 数组的结果

    db.collection.aggregate([
      {
        $project: {
          _id: 0,
          data1: 1,
          "nested.data8": 1
        }
      },
      {
        $set: {
          nested: {
            $filter: {
              input: "$nested",
              cond: { $ne: ["$$this", {}] }
            }
          }
        }
      }
    ])
    

    Playground

    【讨论】:

      猜你喜欢
      • 2021-06-25
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 2020-11-21
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多