Biorąc pod uwagę tablicę [4,7,90,1]
to, czego chcesz w swoim zapytaniu, to:
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 } }
])
Więc co to robi, dla każdego elementu zawartego w tym $or
warunek, user_id
pole jest testowane względem podanej wartości, a $eq
zwraca 1
lub 0
dla true
lub false
.
To, co robisz w swoim kodzie, dotyczy każdego elementu, który masz w tablicy, którą budujesz warunek tablicy $or
. Po prostu tworzymy strukturę haszującą dla każdego warunku równości, przekazując ją do tablicy i podłączając jako wartość tablicy dla $or
stan.
Prawdopodobnie powinienem był usunąć operator $cond z poprzedniego kodu, aby ta część była bardziej przejrzysta.
Oto kod dla Rubinowego Mózgu:
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 } }
]
Jeśli chcesz mieć indywidualne wagi i przyjmiemy pary klucz-wartość, musisz zagnieździć z $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 } }
])
Zwróć uwagę, że to tylko wartość zwracana, nie muszą być one w porządku. I możesz pomyśleć o pokoleniu tego.
Aby wygenerować tę strukturę, zobacz tutaj:
https://stackoverflow.com/a/22213246/2313887