MongoDB - 在没有外来字段匹配的情况下组合两个集合

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

我有 2 个收藏、购买书籍和推荐。他们有完全不同的目的。用户无需购买图书即可进行推荐,反之亦然。但是,我需要询问他们两个。对于每个图书购买文档,用户获得 1 积分,对于每个用户推荐文档,用户获得 2 积分。我尝试使用

$lookup
但如果外国收藏没有匹配项(即 Ryan 不存在于图书购买收藏中,因此将其删除),则它不起作用。

db.bookPurchases.aggregate([ { $group: { _id: "$userId", points: { $sum: 1 } } }, { $lookup: { from: "userReferrals", localField: "_id", foreignField: "userId", as: "referrals" } } ])

我没有完成上面的查询,因为结果不完整(Ryan 失踪了)。即使有一个没有匹配的文档,是否真的可以合并这两个,或者我应该为这些点创建一个单独的集合(我希望我不需要)?

购书收藏(1分)

"userId": "801879404207931443",
"userName": "Philip",
"bookId": "111101"

"userId": "801892568375361586",
"userName": "Josh",
"bookId": "211104"

用户推荐收集(2分)

"userId": "801879404207931443",
"userName": "Philip",
"referredUserId": "692597720661229598"

"userId": "1119157325891129495",
"userName": "Ryan",
"referredUserId": "1052088956281421824"

这是我需要的结果。

"userId": "801879404207931443",
"userName": "Philip",
"points": 3

"userId": "1119157325891129495",
"userName": "Ryan",
"points": 2

"userId": "801892568375361586",
"userName": "Josh",
"points": 1
database mongodb nosql aggregation-framework nosql-aggregation
1个回答
1
投票

您需要 $unionWith

 之前的 
$group
 阶段来合并来自多个集合的文档。

db.bookPurchases.aggregate([
  {
    $project: {
      _id: 0,
      userId: 1,
      userName: 1,
      point: {
        $toInt: 1
      }
    }
  },
  {
    $unionWith: {
      coll: "userReferrals",
      pipeline: [
        {
          $project: {
            _id: 0,
            userId: 1,
            userName: 2,
            point: {
              $toInt: 2
            }
          }
        }
      ]
    }
  },
  {
    $group: {
      _id: "$userId",
      userName: {
        $first: "$userName"
      },
      points: {
        $sum: "$point"
      }
    }
  },
  {
    $sort: {
      points: -1
    }
  },
  {
    $project: {
      _id: 0,
      userId: "$_id",
      userName: 1,
      points: 1
    }
  }
])

演示@Mongo Playground

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