我正在使用聚合管道来清除数据库集合中的重复数据.但即使在设置{ allowDiskUse: true }之后,它仍抛出以下错误.

Err: "MongoServerError: PlanExecutor error during aggregation :: caused by :: Exceeded memory limit for $group, but didn't allow external spilling; pass allowDiskUse:true to opt in"

objective是在保留数据库中的第一个条目之后删除所有重复项(具有相同startTime的相同phoneNumber).

以下是我的销售渠道:

let pipeline = [
    {
        $group: {
            _id: {
                phoneNumber: "$details.phoneNumber",
                startTime: "$details.startTime",
            },
            docs: { $push: "$$ROOT" },
            count: { $sum: 1 },
        },
    },
    {
        $match: {
            count: { $gt: 1 },
        },
    },
    {
        $unwind: "$docs",
    },
    {
        $sort: {
            "docs.createdAt": 1,
        },
    },
    {
        $skip: 1,
    },
    {
        $replaceRoot: { newRoot: "$docs" },
    },
]

在这里,在调用Aggregate时,我传入了下面类型中提到的"AllowDiskUse",但它仍然抛出相同的错误.

以下是我添加该选项的方式:

const options = {
    allowDiskUse: true,
    maxTimeMS: 10000,
}

然后使用MongoDB node 驱动程序v5.8,使用如下所示的聚合操作:

db.collection(collectionName).aggregate(pipeline, options)

在这里,我按照错误消息的建议添加了AllowDiskUse,但它仍然不起作用.即使在MongoDB中,它也会抛出同样的错误.

compass error

那么,这里的问题是什么?

如果我能以任何其他方式实现我的目标,请发表 comments .

谢谢

推荐答案

请确保您运行的不是MongoDB Atlas共享集群(M0、M2、M5).对于这些,无法启用allowDiskUse.

有关共享集群的限制,请参阅此link.

Mongodb相关问答推荐

如何联接Mongoose中的集合并检索特定字段

MongoDB聚合如何对对象数组中的值求和

联接不返回具有ObjectId和非ObjectId的结果

MongoDB $lookup 查找字段值数组

Mongo按最大分组排序

spring-data-mongodb 上的 TopN 聚合

mongodb.将文档分组在数组中,对它们进行评分计数和求和并添加新字段

分组前的 MongoDb 聚合总数

在我的查询中使用 populate() 时的 MongoDB createIndex()

$group 和 sum + 添加所有大于

Mongo:投影不影响布尔值

Mongoose $inc 枚举验证失败

实现 twitter 和 facebook 之类的主题标签

从 MongoDB find() 结果集中识别最后一个文档

使用 ObjectId.GenerateNewId() 还是离开 MongoDB 创建一个?

Mongo按实际上是数字的字符串值排序

Mongo Schema-less集合和 C#

错误:需要数据和盐参数

mongoosefind()不返回结果

为什么 Mongo 提示会使查询运行速度提高 10 倍?