【问题标题】:Merge two $lookup collections in MongoDB在 MongoDB 中合并两个 $lookup 集合
【发布时间】:2019-01-28 11:31:15
【问题描述】:

在这里,我尝试从我的 challenge 集合中获取聚合结果,challengeuserschallengeusers 具有 user_id,我也使用 $lookup 来加入用户。

当我使用这个查询时,我得到以下输出。

"challenges": [
    {
        "_id": "5b7bf6fd87ec106308d7e3c1",
        "start_date": "2018-08-09T12:40:21.470Z",
        "end_date": "2018-08-05T12:40:21.470Z",
        "challnegedusers": [
            {
                "chalenge_id": "5b7bf6fd87ec106308d7e3c1",
                "user_id": "5b75623db457045e3bb12e0a",
                "status": 1
            },
            {
                "user_id": "5b75643c0a97791bcc9ed64c",
                "status": 1
            },
            {
                "user_id": "5b756144b457045e3bb12e08",
                "status": 1
            }
        ],
        "users": [
            {
                "_id": "5b756144b457045e3bb12e08",
                "first_name": "XYZ"
            },
            {
                "_id": "5b75623db457045e3bb12e0a",
                "first_name": "BAC"
            },
            {
                "_id": "5b75643c0a97791bcc9ed64c",
                "first_name": "YTA"
            }
        ]
    }
]

但我希望 challengeusersusers 合并到一个对象中。

最重要的是我想要challengeusersstatus 和用户信息。

预期输出:

"challenges": [
    {
        "_id": "5b7bf6fd87ec106308d7e3c1",
        "start_date": "2018-08-09T12:40:21.470Z",
        "end_date": "2018-08-05T12:40:21.470Z",
        "challnegedusers": [
            {
                "user_id": "5b75623db457045e3bb12e0a",
                "status": 1,
                "first_name": "BAC"
            },
            {
                "user_id": "5b75643c0a97791bcc9ed64c",
                "status": 1,
                "first_name": "YTA"
            },
            {
                "user_id": "5b756144b457045e3bb12e08",
                "status": 1,
                "first_name": "XYZ"
            }
        ]
    }
]

我正在使用的 MongoDB 聚合查询。

        let challenges = await ChallengeModel.aggregate([
            { $match: criteria },
            { $lookup: {
                from: 'challengeusers',
                localField: '_id',
                foreignField: 'challenge_id',
                as: 'challnegedusers'
            } },
            { $lookup: {
                    from: 'appusers',
                    localField: 'challnegedusers.user_id',
                    foreignField: '_id',
                    as: 'users'
            } },
            { $sort: {created_at: -1}}
        ]);

【问题讨论】:

  • 你的mongodb版本是多少?
  • MongoDB shell 版本 v3.6.6

标签: mongodb mongoose aggregation-framework


【解决方案1】:

您可以在 mongodb 3.6 中尝试以下聚合

ChallengeModel.aggregate([
  { "$match": criteria },
  { "$lookup": {
    "from": "challengeusers",
    "let": { "challengeusersId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$challenge_id", "$$challengeusersId" ] } } },
      { "$lookup": {
        "from": "appusers",
        "let": { "user_id": "$user_id" },
        "pipeline": [
          { "$match": { "$expr": { "$eq": [ "$_id", "$$user_id" ] } } },
        ],
        "as": "user"
      }},
      { "$unwind": "$user" },
      { "$addFields": { "first_name": "$user.first_name" }},
      { "$project": { "user": 0 }}
    ],
    "as": "challnegedusers"
  }}
])

用你的方法你可以试试这个

ChallengeModel.aggregate([
  { "$match": criteria },
  { "$lookup": {
    "from": "challengeusers",
    "localField": "_id",
    "foreignField": "challenge_id",
    "as": "challnegedusers"
  }},
  { "$unwind": "challnegedusers" },
  { "$lookup": {
    "from": "appusers",
    "localField": "challnegedusers.user_id",
    "foreignField": "_id",
    "as": "challnegedusers.user"
  }},
  { "$unwind": "challnegedusers.user" },
  { "$addFields": { "challnegedusers.first_name": "$challnegedusers.user.first_name" }},
  { "$sort": { "created_at": -1 }},
  { "$group": {
    "_id": "$_id",
    "start_date": { "$first": "$start_date" }
    "end_date": { "$first": "$end_date" },
    "challnegedusers": { "$push": "$challnegedusers" }
  }}
])

【讨论】:

  • 第一个查询按我希望的那样工作。谢谢你。你是英雄。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
相关资源
最近更新 更多