如何合并 unwind mongodb 的输出?

How to merge output from unwind mongodb?

例如,我在这样的集合中有数据:

db.inventory2.insertMany([
  { "_id" : 1, "item" : "ABC", price: NumberDecimal("80"), "sizes": [ "S", "M", "L"] },
  { "_id" : 2, "item" : "EFG", price: NumberDecimal("120"), "sizes" : [ ] },
  { "_id" : 3, "item" : "IJK", price: NumberDecimal("160"), "sizes": ["M"] },
])

并且,在添加 $unwind 时,我想 select 具有尺寸的项目不为空。

我加上$unwind后的结果:

db.inventory2.aggregate( [ { $unwind: { path: "$sizes" } } ] )
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "S" }
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "M" }
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "L" }
{ "_id" : 3, "item" : "IJK", "price" : NumberDecimal("160"), "sizes" : "M" }

我的问题是,当我添加$unwind时,如何不分隔结果项“ABC”。我的期望结果是这样的:

{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : ["S", "M", "L"] }
{ "_id" : 3, "item" : "IJK", "price" : NumberDecimal("160"), "sizes" : ["M"] }

感谢之前的帮助。

根据我从您的问题中了解到的情况,您正在尝试使用 sizes 不是空数组来过滤文档。

您不需要 $unwind 舞台,而是 $match 舞台。

db.collection.aggregate([
  {
    $match: {
      sizes: {
        $ne: []
      }
    }
  }
])

Sample Mongo Playground 1


db.collection.aggregate([
  {
    $match: {
      $expr: {
        $ne: [
          {
            "$size": "$sizes"
          },
          0
        ]
      }
    }
  }
])

Sample Mongo Playground 2

用这个代替 $unwind 怎么样:

db.inventory2.aggregate([
  {
      $addFields : {
          "sizeCount" : {$size: "$sizes"}
      }
  },
  {$match: {"sizeCount" : {$gt: 0}}},
  {$project: {"sizeCount" : 0}}
])