Dada a matriz
[4,7,90,1]
o que você quer na sua consulta é isso: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 } }
])
Então, o que isso faz é, para cada item contido nesse
$or
condição, o user_id
campo é testado em relação ao valor fornecido e $eq
retorna 1
ou 0
para true
ou false
. O que você faz no seu código é para cada item que você tem na matriz que você cria a condição da matriz de
$or
. Então, está apenas criando uma estrutura de hash para cada condição igual, passando-a para uma matriz e conectando-a como o valor da matriz para o $or
doença. Eu provavelmente deveria ter deixado o operador $cond fora do código anterior para que essa parte ficasse mais clara.
Aqui está algum código para o 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 você quiser ter pesos individuais e assumiremos pares de valores-chave, você precisará aninhar com $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 } }
])
Observe que é apenas um valor de retorno, eles não precisam estar em ordem. E você pode pensar na geração disso.
Para gerar esta estrutura veja aqui:
https://stackoverflow.com/a/22213246/2313887