Gegeben sei das Array [4,7,90,1]
Was Sie in Ihrer Abfrage wollen, ist Folgendes:
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 } }
])
Was das also tut, ist für jedes Element, das in diesem $or
enthalten ist Bedingung, die user_id
Feld wird gegen den gelieferten Wert getestet und $eq
gibt 1
zurück oder 0
für true
oder false
.
Was Sie in Ihrem Code tun, ist für jedes Element, das Sie in dem Array haben, das Sie erstellen die Array-Bedingung von $or
. Es wird also nur eine Hash-Struktur für jede Gleichheitsbedingung erstellt, an ein Array übergeben und als Array-Wert für $or
eingefügt Zustand.
Ich hätte wahrscheinlich den $cond-Operator aus dem vorherigen Code weglassen sollen, damit dieser Teil klarer wäre.
Hier ist ein Code für das 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 } }
]
Wenn Sie individuelle Gewichtungen haben möchten und wir von Schlüssel-Wert-Paaren ausgehen, müssen Sie mit $cond :
verschachtelndb.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 } }
])
Beachten Sie, dass es sich nur um einen Rückgabewert handelt, diese müssen nicht in Ordnung sein. Und Sie können über die Erzeugung davon nachdenken.
Zur Generierung dieser Struktur siehe hier:
https://stackoverflow.com/a/22213246/2313887