如果我添加管道并创建变量,为什么 $lookup 需要 $expr?

问题描述 投票:0回答:2

我一直在尝试在 $match 管道阶段不使用 $expr 的情况下从集合中获取数据,因为与简单的 $match 相比,它的性能较低

这是我一直在研究的一段代码:

        from: 'messages',
        let: { "iId": "$_id" },
        pipeline: [
          {
            $match: {
              $expr: {
                $and: [
                  { $eq: ["$interactionId", '$$iId'] },
                  { $eq: ["$author.role", 'agent'] }
                ]
              }
            }
          }
        ],
        as: "messages"
      }
    },

我期望将此条件更改为:

    {
      $lookup: {
        from: 'messages',
        pipeline: [
          {
            $match: {
              "interactionId": "$_id",
              "author.role": "agent"
            }
          },
        ],
        as: "messages"
      }
    },
mongodb aggregate lookup
2个回答
0
投票

一个选项可能是:

...
{
  $lookup: {
    from: 'messages',
    localField: "_id",
    foreignField: "interactionId",
    pipeline: [
      {
        $match: {
          "author.role": "agent"
        }
      }
    ],
    as: "messages"
  }
},
...

0
投票

pipeline
里面
$lookup
没有任何对父集合数据的引用,它只有对当前数据的引用。 所以你总是必须使用
let
变量来访问父级的任何数据

© www.soinside.com 2019 - 2024. All rights reserved.