我正在尝试使用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
});
有没有其他方法可以得到我想要的,或者我应该在上面的查询中传递其他东西?谢谢。
首先在管道中运行一个< code>$match,只保留一个范围内的< code>id.idiInner.k1的文档,这样就可以只获取该范围内的结果。因为您对< code>id键上的副本感兴趣,所以所有复制的文档都将满足这个标准。看看你应该把这个范围缩小多少,然后在下一个范围运行它,等等。直到覆盖所有文档。
如果这是您必须经常做的事情,请通过声明范围来自动化,循环馈送它们,保留每次运行的副本并最终合并结果。
另一个快速的黑客/技巧是绕过 mongos 并直接在每个分片中运行聚合。这样做会将您的文档大致限制(假设分片平衡良好)为 docs/number_of_shards,并且您可能会克服内存限制。在第二种方法中,我假设您的分片键是 id 键,但如果不是,那么这种方法将不起作用,因为相同的重复文档将分散在分片中。
请在运行命令中使用allowDiskTrue。
db.runCommand(
{ aggregate: "collection",
pipeline: [
{ $group: {
_id: { id: "$id" },
uniqueIds: { $addToSet: "$_id" },
count: { $sum: 1 }
} },
{ $match: {
count: { $gte: 2 }
} },
{ $sort : { count : -1} },
{ $limit : 10 }
],
allowDiskUse: true
}
)
让我知道这是否适合您。
我使用这个查询来查找状态(“Isactive”:false);true或false;还根据状态查找年龄,最后一次计数总额 跟随错误 聚合失败 _geterrorwithcode@src/mongo/shell/utils.js:25:13
我很难相信这个问题还没有在某个地方被问到并回答过,但我找不到任何它的痕迹。
我使用Nodejs和MongoDB与expressjs和mongoose库,创建一个具有用户、文章和评论模式的博客API。下面是我使用的模式。
问题内容: 采集: 我的问题是,是否可以在聚合查询中调用方法? 如果可能的话,它的语法是什么?结果: 在我的实际应用程序中,每个文档有10个布尔标志。如果用户获得了此文档,我想转换这些标志并给它们一个含义(对于用户)。例如认为文件代表轮胎。 总而言之,我想说的是,如果 在以下情况下需要更换轮胎(破损或更换): 当文档返回给用户时,应删除标记。取而代之的是,我们有一个状态字段,说明轮胎是正常的还是损
主要内容:aggregate() 方法,管道MongoDB 中的聚合操作用来处理数据并返回计算结果,聚合操作可以将多个文档中的值组合在一起,并可对数据执行各种操作,以返回单个结果,有点类似于 SQL 语句中的 count(*)、group by 等。 aggregate() 方法 您可以使用 MongoDB 中的 aggregate() 方法来执行聚合操作,其语法格式如下: db.collection_name.aggregate(aggr
并给我带来这些结果: {“_id”:{“name”:“city1”},“count”:212} {“_id”:{“name”:“city2”},“count”:1200} https://hexdocs.pm/mongodb/readme.html#贡献 提前谢了。