Почему-то кажется, что мой код не даст мне значения progress
и completed
, как предполагалось.
в данный момент выполняется запрос ,, это приведет к:
[{
badgeid:4,
progress:44,
"name":"x1",
"progress":0,
"completed":false,
"userid":"5c8522a96bcca9268c0753fe"
},
{
"badgeid":5,
"progress":44,
"name":"x2",
"completed":false,
"userid":"5c8522a96bcca9268c0753fe"
}
]
По какой-то причине он не даст соответствующее значение прогресса и завершенное значение соответствующему достижению.
Я определил, когда документ achievement_users
badgeid 5
с атрибутом completed
true
будет возвращать все документы с completed true
вместо того, чтобы фактически давать правильные значения отдельным документам.
Я бы хотел, чтобы прогресс был связан с соответствующим bageid
с правильным значением и таким же с завершенным, если у пользователя нет записи со значком в достижении_пользователей, completed
будет false
, иначе это будет забрать с соответствующего.
Как бы мне этого добиться?
База данных текущих достижений:
{
badgeid:5,
progress:44,
completed:true,
userid:"5c8522a96bcca9268c0753fe"
}
База текущих достижений:
[
{
"badgeid":4,
"name":"xx1",
"max":100,
},
{
"_id":"5c94c032758c8a2044404995",
"badgeid":5,
"name":"xx2",
"max":1,
}
]
Вот мой агрегат:
achivementUsers.aggregate([
{ "$match": { "userid": '' +userid + '' }},
{ "$lookup": {
"from": "achievements",
"let": { "badgeid": "$badgeid", "progress": "$progress", "userid": "$userid", "completed":"$completed" },
"pipeline": [
{ "$addFields": {
"progress": { "$cond": [{ "$eq": ["$badgeid", "$badgeid"] }, "$$progress", 0] },
"completed": { "$cond": [{ "$eq": ["$badgeid", "$$badgeid"] }, true, false] },
"userid": "$$userid",
}}
],
"as": "inventory_docs"
}},
{ "$unwind": "$inventory_docs" },
{ "$replaceRoot": { "newRoot": "$inventory_docs" }}
]).then(function (response) {
редактирование:
желаемый вывод:
[{
badgeid:4,
progress:0,
"name":"x1",
"progress":0,
"completed":false,
"userid":"5c8522a96bcca9268c0753fe"
},
{
"badgeid":5,
"progress":44,
"name":"x2",
"completed":true,
"userid":"5c8522a96bcca9268c0753fe"
}
]