我目前正在制作一个成就系统,并尝试将其保存在两个集合中.
一个包含名称和ID的集合,
以及其他与用户有关的收藏及其进度.@H_301_4@
我一直在查看“聚合”和“ $lookup”,并取得了一些进展,但是我不确定要获得所需的输出将需要做什么.@H_301_4@
如果用户存在成就,则通过集合获取进度值及其用户标识;否则,将进度值设为0.@H_301_4@
这不是某种形式的加入,例如MysqL吗?在MongoDB中如何?@H_301_4@
尝试:@H_301_4@
@H_301_4@
db.getCollection('achievements').aggregate([
{
$lookup:
{
from: "achievement_users",localField: "id",foreignField: "id",as: "inventory_docs"
}
}
])
成就模式:@H_301_4@
@H_301_4@
{
"name" : "testing","id" : 1,"max" : 12,},{
"name" : "testing2","id" : 2,}
@H_301_4@
{
"userid" : 33,progress: 1,{
"userid" : 446,}
@H_301_4@
{
name: "testing",id: 1,userid: 33,max : 12,{
name: "testing2",id: 2,progress: 0,
编辑:@H_301_4@
我需要用户已完成但尚未完成的所有成就(未完成=进度= 0).@H_301_4@
这可能是用户尚未完成的成就.我也要列出它们,但要使进度值为0.@H_301_4@
更新2:
也需要它给我结果,而那个特殊用户ID的Achievement_users中没有匹配项.
最佳答案
您可以使用以下汇总@H_301_4@
@H_301_4@
db.achievement_users.aggregate([
{ "$match": { "userid": 33 }},{ "$lookup": {
"from": "achievement","let": { "id": "$id","progress": "$progress","userid": "$userid" },"pipeline": [
{ "$addFields": {
"progress": { "$cond": [{ "$eq": ["$id","$$id"] },"$$progress",0] },"userid": "$$userid"
}}
],"as": "inventory_docs"
}},{ "$unwind": "$inventory_docs" },{ "$replaceRoot": { "newRoot": "$inventory_docs" }}
])