【问题标题】:Mongo DB project elements of an array into a single arrayMongodb项目将一个数组元素合并为单个数组
【发布时间】:2021-03-16 20:26:18
【问题描述】:

我的数据库中有一个集合,其中每个项目如下所示:

{
  "_id" : ObjectId("XXXXXX"),
  "name" : "foo",
  "products" : [{
      "name" : "bar",
      "code" : 123
   },{
      "name" : "foo",
      "code" : 321
   }]
}

我想从查询中得到一个数组,其中包含:来自特定集合的 [123, 321]。

这是我尝试过的:

  db.getCollection('catalog').aggregate({
        "$project": {
        "products": {
            "$map": {
                "input": "$products",
                "as" : "item",
                "in" : "$$item.code"
            }
        }
        }
    })

但它失败并显示“最后阶段未定义”。

我做错了什么?

【问题讨论】:

  • 我认为问题不完整 - mongoplayground.net/p/LUu3O03QZj1
  • 我从字面上复制粘贴了您的示例,但对我仍然不起作用。不知道怎么回事
  • { $project: { products: "$products.code" } } 会更短

标签: mongodb projection


【解决方案1】:

您可以使用以下聚合获得这样的输出,{ "products" : [ 123, 321 ] }。请注意使用 $reduce 而不是 $map 数组运算符。

db.collection.aggregate([
  { 
      $project: {
          _id: 0,
          products: { 
              $reduce: { 
                  input: "$products", 
                  initialValue: [],
                  in: { 
                      $concatArrays: [ "$$value", ["$$this.code"] ] 
                  } 
              }
          }
      }
  }
])

【讨论】:

  • 尝试此操作时出现此错误:{“ok”:0,“errmsg”:“不支持聚合项目运算符:'$reduce'”,“代码”:305 }:聚合失败:
  • 上述聚合在mongo shell 和 MongoDB v4.2.8 中运行良好。没有错误。已使用您发布的文档进行了测试。
  • 您能说说您的工作环境吗?您使用什么工具和 MongoDB 版本?
  • 我正在使用 MongoDB 3.6.0 并使用 Robo3T 进行测试
  • MongoDB v3.6 有$reduce 运算符;在聚合查询中使用它是有效的。此外,$concatArrays 运算符和$project 阶段。我发布的聚合查询也适用于 MongoDB v3.6。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多