как уменьшить ненужные этапы размотки из конвейера агрегации - PullRequest
0 голосов
/ 05 мая 2020

Например, если я применяю много этапов поиска в конвейере агрегации, и каждый поиск сопровождается разворачиванием (просто для того, чтобы скрыться в объекте), первый вопрос: влияет ли это на производительность запроса? и если да, то как это сделать оптимизированным образом

Примечание: все поиски вернут только один объект

Например:

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 Ответ

1 голос
/ 07 мая 2020

Что касается комментариев, здесь дополнительно $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'
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...