MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongo:как да сортирате по външно тегло

Даден е масивът [4,7,90,1] това, което искате във вашата заявка, е това:

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

Така че това прави е за всеки елемент, съдържащ се в този $or условие, user_id полето се тества спрямо предоставената стойност и $eq връща 1 или 0 за true или false .

Това, което правите във вашия код, е за всеки елемент, който имате в масива, който изграждате условието на масива на $or . Така че просто се създава хеш структура за всяко условие за равенство, предава се на масив и се включва като стойност на масива за $or състояние.

Вероятно трябваше да оставя оператора $cond извън предишния код, така че тази част щеше да е по-ясна.

Ето малко код за 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 } }
]

Ако искате да имате индивидуални тегла и ние ще приемем двойки ключови стойности, тогава трябва да вложите с $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 } }
])

Имайте предвид, че това е просто връщана стойност, те не трябва да са в ред. И можете да помислите за поколението на това.

За генериране на тази структура вижте тук:

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Оперативни фактори, които трябва да се вземат предвид по време на моделиране на данни на MongoDB

  2. Не мога да се удостоверя на mongodb с PHP

  3. MongoDB:безусловни актуализации?

  4. Сортиране по виртуално поле в mongoDB (mongoose)

  5. $първо в mongodb