【发布时间】:2016-06-02 09:14:25
【问题描述】:
我正在尝试使用 id 字段在我的分片集合中查找重复项,该字段属于这种模式 -
"id" : {
"idInner" : {
"k1" : "v1",
"k2" : "v2",
"k3" : "v3",
"k4" : "v4"
}
}
我使用了以下查询,但收到“异常:超过 $group 的内存限制,但不允许外部排序。通过 allowDiskUse:true 来选择加入。”错误,即使我在查询中使用了“allowDiskUse:true”。
db.collection.aggregate([
{ $group: {
_id: { id: "$id" },
uniqueIds: { $addToSet: "$_id" },
count: { $sum: 1 }
} },
{ $match: {
count: { $gte: 2 }
} },
{ $sort : { count : -1} },
{ $limit : 10 }
],
{
allowDiskUse : true
});
有没有其他方法可以得到我想要的,或者我应该在上面的查询中传递什么?谢谢。
【问题讨论】:
-
_id字段本身始终使用“唯一”约束进行索引。它不能包含重复项。 -
这不是“_id”字段,在我的情况下,我默认让 mongo 填充。我有自己的“id”(不带下划线),其中包含我的密钥。
-
您的群组中真的需要
uniqueIds: { $addToSet: "$_id" }吗?这可能会缓解一些内存问题。 -
我的收藏中有大约 200 万个文档。注释掉 'uniqueIds: { $addToSet: "$_id" }' 以及使用 '_id: "$id.idInner"' 仍然会出现同样的错误。
-
如果你想要基于你自己的“id”的集合中的唯一数据,我建议在它上面创建唯一索引。这是确保收集中唯一文档的最有效方式。
标签: mongodb aggregation-framework