如何减少聚合管道中不必要的展开阶段

时间:2020-05-05 20:30:19

标签: mongodb optimization mongoose aggregation-framework

就像我在聚合管道中应用许多查找阶段,并且每次查找后都展开(只是隐蔽到对象中)第一个问题是否会影响查询性能?如果是的话,如何以最佳方式做到这一点

注意:所有查找将仅返回一个对象

例如:

xyz.aggregate([
{ $lookup:{ ----}} //first lookup
{$unwind :{----}} //first unwind
{ $lookup:{ ----}} //second lookup
{$unwind :{----}} //second unwind
{ $lookup:{ ----}} //third lookup
{$unwind :{----}} //third unwind
{ $lookup:{ ----}} //fourth lookup
{$unwind :{----}} //fourth unwind
])

1 个答案:

答案 0 :(得分:1)

参考注释,这里是高级$lookup

$lookup: {
        from: 'accounts',
        let: { "localAccountField": "$account" },
        pipeline: [
          {
            $match: {
              $expr: {
                $eq: ["$_id", "$$localAccountField"]
              }
            }
          },
          {
            $project: {
              _id: 1,
              user: 1
            }
          },
          {
            $lookup: {
              from: 'users',
              let: { 'localUserField': "$user" },
              pipeline: [
                {
                  $match: {
                    $expr: {
                      $eq: ["$_id", "$$localUserField"]
                    }
                  }
                },
                {
                  $project: {
                    _id: 1,
                    username: "$uid",
                    phone:"$phoneNumber",
                    email: "$email.add",
                    name: {
                      $concat: [
                        "$profile.name.first",
                        ' ',
                        "$profile.name.last"
                      ]
                    },
                  }
                }
              ],
              as: "users"
            }
          },
          {
            $lookup: {
              from: 'documents',
              let: { 'localDocumentField': "$user" },
              pipeline: [
                {
                  $match: {
                    $expr: {
                      $eq: ["$user", "$$localDocumentField"]
                    },
                    status:"verified",
                    "properties.expirydate": { $exists: true, $ne: "" },
                    name: "idcard"
                  }
                },
                {
                  $project: {
                    _id: 0,
                    cnic: "$properties.number"
                  }
                }
              ],
              as: "documents"
            }
          }
        ],
        as: 'account'
      }