mongodb - Mongo $lookup,哪种方式最快?
问题描述
自从我开始使用 MongoDB 聚合以来已经有一段时间了。
这是执行复杂查询的好方法,它以我从未想过的方式提高了我的应用程序的性能。
但是,我遇到了$lookup
,似乎有 3 种方式来执行它们。我想知道他们每个人的优点和缺点是什么。对于以下示例,我从collectionA
usingfieldA
开始匹配文档 from collectionB
usingfieldB
- 我称之为预设 $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 }
}
}
]);
我想知道哪一个是最快的 如果有任何参数可以使一个比其他参数更快 如果其中一个有任何限制
据我所知,我发现: find + aggregate比预设 $lookup快,这比自定义 $lookup快 但是我想知道为什么自定义 $lookup存在......
解决方案
如果数据太大,预设查找会更快。 为什么
- 所有数据都在数据库级别查找,数据将保存在另一个变量中。
- 随着数据的增加,查找和聚合将花费更长的时间,而聚合时您只是在增加数据。
提示 如果你想使用find 和 aggregate,你应该看到 MongoDB 的不同查询。例子
var arr = db.collection('collectionA').distinct('fieldA',{});
db.collection('collectionB').aggregate([
{
$match: {
fieldB: { $in: arr}
}
}
]);
推荐阅读
- javascript - 在 laravel 中使用 reactjs 显示图像
- r - ggplot 将分组的条形图分成单独的条形图(按 y 值降序排列)
- angularjs - 是否可以在 ng-if 中将一次与 Angualrjs 中的一种方式绑定混合在一起?
- javascript - Idangero Sniper:添加幻灯片
- express - POST http://localhost:3000/api/login 504(网关超时)
- c# - 以另一种方式调用类
- swift - 线程 1:致命错误:tableViewCell 中的索引超出范围
- java - Cordova 插件 - 使用 AAR
- c# - 通用存储库、工作单元、Unity 的架构问题
- javascript - 尝试单击隐藏然后再次可见的元素时出错