MongoDB setIntesection 数组的数组

标签 mongodb

我是 Mongo DB 的新手,在使聚合交集正常工作时遇到了一些麻烦。

假设我的集合中只有以下文档:

{"ids" : [ [ 1, 4, 7, 10, 13 ], [ 1, 3, 5, 7, 9, 11, 13, 15 ], [1, 3, 5, 7] ] }

我想回去

{"intersection" : [1, 7]}

我在做:

db.collection.aggregate([ {$project: {intersection:{$setIntersection:"$ids"}}} ])

但那是回归

{"intersection" : [ [ 1, 4, 7, 10, 13 ], [ 1, 3, 5, 7, 9, 11, 13, 15 ], [1, 3, 5, 7] ] }

我假设这是因为“$ids”被解释为一个整数数组的数组,而不是每个 arg 都是一个整数数组的 var-args。

知道如何让它工作吗?

最佳答案

您似乎想要查找 ids 内每个数组中出现的所有元素。

这不能用集合交集来处理,因为它们是数组元素而不是文档中的字段,并且没有办法在投影中引用单个数组元素。

这里有一个解决方法,可能有效也可能无效,具体取决于聚合需求的其余部分:

db.inter.aggregate(
     {$project:{ids:1,  sz:{$size:"$ids"}}},
     {$unwind:"$ids"},
     {$unwind:"$ids"},
     {$group:{_id:{_id:"$_id",ids:"$ids"},count:{$sum:1},need:{$first:"$sz"}}},
     {$project:{keep:{$eq:["$need","$count"]}}},{$match:{keep:true}},{$sort:{_id:1}},
     {$group:{_id:"$_id._id",intersection:{$push:"$_id.ids"}}},
     {$project:{ intersection:1}}
)

这会计算出数组的数组有多少个元素,然后计算每个数字在未展开的集合中出现的次数。如果它与大小相同,则它必须在每个子元素中。但是,这假定每个子元素不能两次具有相同的数字。

关于MongoDB setIntesection 数组的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23813680/

相关文章:

php - 具有不同值和排序值的 MongoDB geoNear

node.js - 在大型 Mongo 集合中,如何使用 mongoose 仅​​检索 ID(或任何其他特定属性)?

javascript - 判断 collection.forEach 是否完成

node.js - mongo-db native 客户端中的数据库连接

C# MongoDB Filter 返回整个对象

javascript - 限制Meteor中mongodb返回的字段数量

mongodb - NO-SQL 对小型企业应用程序可靠吗?

node.js - 在 mongoDB 中查询以获取具有不同值和最后添加的记录

mongodb - Mongo 比较并导入缺失数据

MongoDB 聚合以及使用关联集合字段进行查找和排序会减慢查询速度