首页 > 解决方案 > Mongo $lookup,哪种方式最快?

问题描述

自从我开始使用 MongoDB 聚合以来已经有一段时间了。

这是执行复杂查询的好方法,它以我从未想过的方式提高了我的应用程序的性能。

但是,我遇到了$lookup,似乎有 3 种方式来执行它们。我想知道他们每个人的优点和缺点是什么。对于以下示例,我从collectionAusingfieldA开始匹配文档 from collectionBusingfieldB

  1. 我称之为预设 $lookup
{
   $lookup: {
       from: 'collectionB',
       localField: 'fieldA',
       foreignField: 'fieldB',
       as: 'documentsB'
   }
}
  1. 我称之为自定义 $lookup
{
   $lookup: {
       from: 'collectionB',
       let: { valueA: '$fieldA' },
       pipeline: [
           {
               $match: {
                   $expr: {
                       $eq: ['$$valueA', '$fieldB']
                   }
               }
           }
       ],
       as: 'documentsB'
     }
}
  1. 执行查找然后聚合_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存在......

标签: mongodbmongodb-queryaggregation-framework

解决方案


如果数据太大,预设查找会更快。 为什么

  • 所有数据都在数据库级别查找,数据将保存在另一个变量中。
  • 随着数据的增加,查找和聚合将花费更长的时间,而聚合时您只是在增加数据。

提示 如果你想使用find 和 aggregate,你应该看到 MongoDB 的不同查询。例子

var arr = db.collection('collectionA').distinct('fieldA',{});    
db.collection('collectionB').aggregate([
     { 
        $match: {
            fieldB: { $in: arr}
        }
    }
   ]);

推荐阅读