Data la matrice [4,7,90,1]
quello che vuoi nella tua query è questo:
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 } }
])
Quindi quello che fa è, per ogni elemento contenuto in quel $or
condizione, il user_id
campo viene testato rispetto al valore fornito e $eq
restituisce 1
o 0
per true
o false
.
Quello che fai nel tuo codice è per ogni elemento che hai nell'array che costruisci la condizione dell'array di $or
. Quindi sta solo creando una struttura hash per ogni condizione uguale, passandola a un array e collegandola come valore dell'array per $or
condizione.
Probabilmente avrei dovuto lasciare l'operatore $cond fuori dal codice precedente, quindi questa parte sarebbe stata più chiara.
Ecco un po' di codice per 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 } }
]
Se vuoi avere pesi individuali e assumiamo coppie di valori chiave, devi annidare con $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 } }
])
Nota che è solo un valore di ritorno, non è necessario che siano in ordine. E puoi pensare alla generazione di questo.
Per generare questa struttura vedi qui:
https://stackoverflow.com/a/22213246/2313887