sql >> Databáze >  >> NoSQL >> MongoDB

Mongo:jak třídit podle externí hmotnosti

Vzhledem k poli [4,7,90,1] to, co chcete ve svém dotazu, je toto:

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 } }
])

Takže to udělá pro každou položku obsaženou v tomto $or podmínku user_id pole je testováno proti zadané hodnotě a $eq vrátí 1 nebo 0 pro true nebo false .

To, co děláte ve svém kódu, je pro každou položku, kterou máte v poli, které vytvoříte podmínka pole $or . Takže je to jen vytvoření hashové struktury pro každou podmínku se rovná, předání ji do pole a připojení jako hodnota pole pro $or podmínka.

Pravděpodobně jsem měl z předchozího kódu vynechat operátor $cond, takže tato část by byla jasnější.

Zde je nějaký kód pro 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 } }
]

Pokud chcete mít individuální váhy a budeme předpokládat páry klíč-hodnota, musíte se vnořit s $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 } }
])

Všimněte si, že je to pouze návratová hodnota, nemusí být v pořádku. A můžete přemýšlet o generaci toho.

Pro generování této struktury viz zde:

https://stackoverflow.com/a/22213246/2313887




  1. Jak na to:Použijte rozhraní Apache HBase REST, část 3

  2. Pizza Tribes – strategická hra v reálném čase založená na prohlížeči pro více hráčů

  3. NodeJs – pomocí redis, connect-redis s express

  4. Aktualizujte více prvků v poli v mongodb