我有 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
您需要 $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
}
}
])