【问题标题】:Mongodb elemMatch not reading variable from aggregate rootMongodb elemMatch 未从聚合根读取变量
【发布时间】:2022-02-22 09:30:03
【问题描述】:

我正在尝试从 users 集合构建聚合查询。每个用户都有一个在 clients 集合数组中关联的 id 属性:

// users...
[
  {
    id: '12345',
    name: 'John'
  }
  // ...
}
// clients...
[
  {
    name: 'Foo',
    members: [ { id: '1234', role: 'Admin' } ]
  },
  // ....
]

所以我要做的是聚合users 集合并执行$lookup 以“加入”用户所属的客户端(通过id

db.users.aggregate([
  $lookup: {
      from: 'clients',
      as: 'clients',
      let: { user_id: '$id' },
      pipeline: [
        {
          $match: {
            members: {
              $elemMatch: { id: '$user_id' },
            },
          },
        },
      ],
    };
}])

如果我将任何用户的 ID 硬编码到 $elemMatch(替换 $user_id)中,它可以工作,但我似乎无法让它作为 user 记录中的变量工作。

【问题讨论】:

  • 嵌套管道中的 $$ 是双倍的:$elemMatch: { id: '$$user_id' },

标签: mongodb


【解决方案1】:

来自$lookup let

$match 阶段需要使用 $expr 运算符来访问变量。 $expr 运算符允许在 $match 语法中使用聚合表达式。

根据您的场景,

  1. 需要 $expr 才能访问该变量。
  2. 应用 $in 运算符而不是 $elemMatch
  3. 要引用管道中的变量,请使用 $$<variable> 而不是 $<variable>
{
  $match: {
    $expr: {
      $in: [
        "$$user_id",
        "$members.id"
      ]
    }
  }
}

Sample Mongo Playground

【讨论】:

    猜你喜欢
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    相关资源
    最近更新 更多