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