MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Mongo:como classificar por peso externo


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