Даден е масивът [4,7,90,1]
това, което искате във вашата заявка, е това:
db.collection.aggregate([
{ "$project": {
"user_id": 1,
"content": 1,
"date": 1,
"weight": { "$or": [
{ "$eq": ["$user_id": 4] },
{ "$eq": ["$user_id": 7] },
{ "$eq": ["$user_id": 90] },
{ "$eq": ["$user_id": 1] },
]}
}},
{ "$sort": { "weight": -1, "date": -1 } }
])
Така че това прави е за всеки елемент, съдържащ се в този $or
условие, user_id
полето се тества спрямо предоставената стойност и $eq
връща 1
или 0
за true
или false
.
Това, което правите във вашия код, е за всеки елемент, който имате в масива, който изграждате условието на масива на $or
. Така че просто се създава хеш структура за всяко условие за равенство, предава се на масив и се включва като стойност на масива за $or
състояние.
Вероятно трябваше да оставя оператора $cond извън предишния код, така че тази част щеше да е по-ясна.
Ето малко код за Ruby Brain:
userList = [4, 7, 90, 1];
orCond = [];
userList.each do |userId|
orCond.push({ '$eq' => [ 'user_id', userId ] })
end
pipeline = [
{ '$project' => {
'user_id' => 1,
'content' => 1,
'date' => 1,
'weight' => { '$or' => orCond }
}},
{ '$sort' => { 'weight' => -1, 'date' => -1 } }
]
Ако искате да имате индивидуални тегла и ние ще приемем двойки ключови стойности, тогава трябва да вложите с $cond :
db.collection.aggregate([
{ "$project": {
"user_id": 1,
"content": 1,
"date": 1,
"weight": { "$cond": [
{ "$eq": ["$user_id": 4] },
10,
{ "$cond": [
{ "$eq": ["$user_id": 7] },
9,
{ "$cond": [
{ "$eq": ["$user_id": 90] },
7,
{ "$cond": [
{ "$eq": ["$user_id": 1] },
8,
0
]}
]}
]}
]}
}},
{ "$sort": { "weight": -1, "date": -1 } }
])
Имайте предвид, че това е просто връщана стойност, те не трябва да са в ред. И можете да помислите за поколението на това.
За генериране на тази структура вижте тук:
https://stackoverflow.com/a/22213246/2313887