如何解决Mongo $ lookup,哪种方法最快?
自从我开始使用MongoDB聚合以来已经有一段时间了。
这是执行复杂查询的好方法,并且以我从未想到的方式提高了应用的性能。
但是,我遇到了$lookup
,看来有3种执行方法。我想知道它们各自的优点和缺点。
对于以下示例,我从collectionA
开始使用fieldA
,以匹配collectionB
中来自fieldB
的文档,
- 我称之为预设$ lookup
{
$lookup: {
from: 'collectionB',localField: 'fieldA',foreignField: 'fieldB',as: 'documentsB'
}
}
- 我称之为自定义$ lookup
{
$lookup: {
from: 'collectionB',let: { valueA: '$fieldA' },pipeline: [
{
$match: {
$expr: {
$eq: ['$$valueA','$fieldB']
}
}
}
],as: 'documentsB'
}
}
- 在
collectionB
上先执行查找,然后执行汇总
const docsA = db.collection('collectionA').find({}).toArray();
// Basically I will extract all values possible for the query to docB
const valuesForB = docsA.map((docA) => docA.fieldA);
db.collection('collectionB').aggregate([
{
$match: {
fieldB: { $in: valuesForB }
}
}
]);
我想知道哪个是最快的 如果有任何参数使一个参数比其他参数更快 如果其中之一有任何限制
据我所知,我发现: 查找+汇总要比预设$ lookup 快,而自定义$ lookup 但是我不知道为什么自定义$ lookup 存在...
解决方法
如果数据太大而不是预设查找将更快。 为什么
- 所有数据都在数据库级别查找,数据将保存在另一个变量中。
- 在查找和聚合时,数据量会更长,而在聚合时,您只是在增加数据。
提示 如果您要使用查找和汇总,则应该看到MongoDB的distinct查询。 例子
var arr = db.collection('collectionA').distinct('fieldA',{});
db.collection('collectionB').aggregate([
{
$match: {
fieldB: { $in: arr}
}
}
]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。