当前位置: 首页 > 知识库问答 >
问题:

mongodb-聚合失败,内存错误

从阎宝
2023-03-14

我正在尝试使用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
});

有没有其他方法可以得到我想要的,或者我应该在上面的查询中传递其他东西?谢谢。

共有2个答案

江奕
2023-03-14

首先在管道中运行一个< code>$match,只保留一个范围内的< code>id.idiInner.k1的文档,这样就可以只获取该范围内的结果。因为您对< code>id键上的副本感兴趣,所以所有复制的文档都将满足这个标准。看看你应该把这个范围缩小多少,然后在下一个范围运行它,等等。直到覆盖所有文档。

如果这是您必须经常做的事情,请通过声明范围来自动化,循环馈送它们,保留每次运行的副本并最终合并结果。

另一个快速的黑客/技巧是绕过 mongos 并直接在每个分片中运行聚合。这样做会将您的文档大致限制(假设分片平衡良好)为 docs/number_of_shards,并且您可能会克服内存限制。在第二种方法中,我假设您的分片键是 id 键,但如果不是,那么这种方法将不起作用,因为相同的重复文档将分散在分片中。

赵佐
2023-03-14

请在运行命令中使用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#贡献 提前谢了。