【发布时间】:2015-08-19 05:22:11
【问题描述】:
以下名为“coll”的集合在 mongodb 中维护。
{
{"_id":1, "set":[1,2,3,4,5]},
{"_id":2, "set":[0,2,6,4,5]},
{"_id":3, "set":[1,2,5,10,22]}
}
如何找到上述集合文档中的集合元素与_id的1和3的交集。
【问题讨论】:
标签: mongodb
以下名为“coll”的集合在 mongodb 中维护。
{
{"_id":1, "set":[1,2,3,4,5]},
{"_id":2, "set":[0,2,6,4,5]},
{"_id":3, "set":[1,2,5,10,22]}
}
如何找到上述集合文档中的集合元素与_id的1和3的交集。
【问题讨论】:
标签: mongodb
使用 aggregation framework 来获得所需的结果。可以发挥作用的聚合 set operator 是 $setIntersection。
以下聚合管道可实现您的目标:
db.test.aggregate([
{
"$match": {
"_id": { "$in": [1, 3] }
}
},
{
"$group": {
"_id": 0,
"set1": { "$first": "$set" },
"set2": { "$last": "$set" }
}
},
{
"$project": {
"set1": 1,
"set2": 1,
"commonToBoth": { "$setIntersection": [ "$set1", "$set2" ] },
"_id": 0
}
}
])
输出:
/* 0 */
{
"result" : [
{
"set1" : [1,2,3,4,5],
"set2" : [1,2,5,10,22],
"commonToBoth" : [1,2,5]
}
],
"ok" : 1
}
要相交三个或更多文档,您需要 $reduce 运算符来展平数组。这将允许您与任意数量的数组相交,因此不仅仅是对文档 1 和 3 中的两个数组进行交集,这也适用于多个数组。
考虑运行以下聚合操作:
db.test.aggregate([
{ "$match": { "_id": { "$in": [1, 3] } } },
{
"$group": {
"_id": 0,
"sets": { "$push": "$set" },
"initialSet": { "$first": "$set" }
}
},
{
"$project": {
"commonSets": {
"$reduce": {
"input": "$sets",
"initialValue": "$initialSet",
"in": { "$setIntersection": ["$$value", "$$this"] }
}
}
}
}
])
【讨论】:
BufBuilder attempted to grow() to 67108870 bytes, past the 64MB limit.,因为我的集合非常高:每个集合可能包含大约 600K 个 7 字节的元素。您是否有建议的解决方案或解决方法?提前谢谢!