mongodb - 使用 MongoDB 聚合将不同属性的值合并到单个数组中

标签 mongodb

我试图弄清楚如果输入文档与此类似,是否会产生聚合运算符的组合:

[
 { field1: 1, field2: 2 },
 { field1: 2, field2: 3 }
]

在具有单个数组字段的输出文档中,其元素是字段 field1 的不同值和field2输入文档的数量,在此示例中:

{ result: [1,2,3] }

到目前为止我尝试过这些:

  • $addToSet ,但它似乎不支持多个参数,即不允许 $addToSet来自同一文档中的多个属性
  • $project到项目field1field2进入结果数组字段,然后我可以 $unwind然后$addToSet ,但似乎也不支持将两个(或更多)属性投影到数组中。

最佳答案

您的方向是正确的 $addToSet ,但正如您所注意到的,您无法从多个字段创建一个集合。您可以使用 $setUnion 组合多个数组运算符(operator)。您需要在聚合管道中添加一个额外的 $project。

使用 MongoDB shell:

db.coll.aggregate([
    // group to create sets
    { "$group": {
        "_id": null,
        "a": { "$addToSet": "$a" },
        "b": { "$addToSet": "$b" }
    }},
    // project to merge the arrays
    { "$project": { 
        "result": { "$setUnion": [ "$a", "$b" ] }
    }}
]);

关于mongodb - 使用 MongoDB 聚合将不同属性的值合并到单个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24969195/

相关文章:

node.js - 在 Mongoose 预中间件中,我如何访问更新查询?

javascript - 如何判断 Meteor minimongo 何时与 mongo 服务器同步

javascript - Object #<MongoClient> 没有方法 'open'

c# - 使用 LINQ 创建一个包含不同类型的列表?

MongoDB 是 Memcached 更好的替代品?

node.js - Id 没有从嵌套数组中删除

java - 如何将没有时区计算的原始日期/时间存储到 MongoDb

node.js - 文本搜索空格转义

javascript - 使用 $http.get 获取嵌套 JSON 中的数组(mongoose 和 nodejs)

mongodb - Mongoose 会给 node-mongodb-native 驱动程序增加多少开销?