我对这个问题进行了一番研究,但没有找到一个不使用$lookup参数的好方法.

我的文档目前大致如下所示:

{
    ...
    problems:
        [ { ... id: 1, ...}, { ... id: 7, ...}, { ... id: 122, ...} ],
    solutions:
        [ { ... assignedProblems: [1, 7] ... }, { ... assignedProblems: [122] ...} ],
    ... 
}

我现在正在try 将assignedProblems数组与problems中的id数组进行匹配.

我当前的聚合如下所示:

{
    $unwind: {
        path: "$solutions"
    },
    $lookup: {
        from: "problems",
        localField: "solutions.assignedProblems",
        foreignField: "id",
        as: "problems"
    }
}

这种聚合工作得无懈可击,但速度非常慢,即使在使用索引时也是如此.

我try 将$lookup替换为以下内容:

    $match: {
        $expr: {
            $setEquals: ["$solutions.assignedProblems", "$problems.id"]
        }
     }

但是,只有当问题的数量与assignedProblems数组中的元素相同时,这才能起作用.这与使用$eq运算符时的情况相同.

有没有其他方法将这些id与数组进行匹配?

推荐答案

我已经找到了解决我正在努力做的事情的办法.

我把$lookup的stage换成了这个:

$addFields: {
    problems: {
        $filter: {
            input: "$problems",
            cond: {
                $in: ["$$this.id", "$solutions.assignedProblems"]
            }
        }
    }
}

这将问题数组替换为一个新的数组,该数组只包括具有assignedProblems数组中的id元素的problems个对象.

Database相关问答推荐

位置运算符($)工作不正确

如何正确创建mongo模型和客户端?

Prisma - 将属性的类型设置为枚举数组

Android Room持久性库@Update不起作用

如何在 SQL Server 中生成随机数据?

如何验证 SQLAlchemy ORM 中的列数据类型?

Oracle在哪些情况下会自动创建索引?

使用脚本语言动态数据库

Redis:数据库大小与内存的比率?

Grails 中的 SQL/数据库视图

数据库 - 设计 Events事件表

在 Firestore 中使用嵌套的单个查询

MySQL 中 NOW()、SYSDATE() 和 CURRENT_DATE() 之间的区别

如何在 SQL Server 中生成并手动插入唯一标识符?

SQLite3 UNIQUE 约束失败错误

将查询限制为一条记录会提高性能吗

多个和单个索引

查询以查找列的 nᵗʰ 最大值

包含 8000 万条记录并添加索引的表需要超过 18 小时(或永远)!怎么办?

DBMS中数据模型和数据库模式的区别?