MongoDB聚合相同集合

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

收藏用户:

    _id: ObjectId,
    name: 'string',
    requests: [
        {
            ref: 'users',
            type: Schema.Types.ObjectId,
            default: null
        }
    ],

我需要聚合相同的集合。所以,这是用户一的演示数据

{
  "_id": {
    "$oid": "668372606b19b60fbe84e4b9"
  },
  "name": "user1",
  "requests": []
}

这是用户二:

{
  "_id": {
    "$oid": "6687c6e1ebe711aac96de69d"
  },
  "name": "user2",
  "requests": [
    {
      "$oid": "668372606b19b60fbe84e4b9"
    }
  ]
}

我需要给出user2的id并聚合请求数组数据并返回user1的名称(数组可以有更多id)

我的查询是:

        let requests = await User.aggregate([
            {
                $match: { _id: new mongoose.Types.ObjectId(userId)} //comes from frontend
            },
            { $lookup: {
                    from: "users",
                    let: { requests: "$requests" },
                    pipeline: [
                        { $match: { $expr: { $in: ["$_id", "$$requests"] }}},
                    ],
                    as: "requestsData"
                }
            }

        ]);

但它返回一个空数组。

node.js mongodb mongoose
1个回答
0
投票

你在

$lookup
阶段感到困惑。
let
变量应包含当前集合文档中的字段。因此,它应该是
_id
,即 user1 值。

db.users.aggregate([
  {
    $match: {
      _id: new mongoose.Types.ObjectId(userId) //comes from frontend
  },
  {
    $lookup: {
      from: "users",
      let: {
        id: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$$id",
                "$requests"
              ]
            }
          }
        }
      ],
      as: "requestsData"
    }
  }
])

演示@Mongo Playground

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