MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Mongo:jak sortować według wagi zewnętrznej

Biorąc pod uwagę tablicę [4,7,90,1] to, czego chcesz w swoim zapytaniu, to:

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

Więc co to robi, dla każdego elementu zawartego w tym $or warunek, user_id pole jest testowane względem podanej wartości, a $eq zwraca 1 lub 0 dla true lub false .

To, co robisz w swoim kodzie, dotyczy każdego elementu, który masz w tablicy, którą budujesz warunek tablicy $or . Po prostu tworzymy strukturę haszującą dla każdego warunku równości, przekazując ją do tablicy i podłączając jako wartość tablicy dla $or stan.

Prawdopodobnie powinienem był usunąć operator $cond z poprzedniego kodu, aby ta część była bardziej przejrzysta.

Oto kod dla Rubinowego Mózgu:

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

Jeśli chcesz mieć indywidualne wagi i przyjmiemy pary klucz-wartość, musisz zagnieździć z $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 } }
])

Zwróć uwagę, że to tylko wartość zwracana, nie muszą być one w porządku. I możesz pomyśleć o pokoleniu tego.

Aby wygenerować tę strukturę, zobacz tutaj:

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mapowanie w tworzeniu indeksu w elasticsearch przez rzekę mongodb nie działa

  2. Głęboka tablica aktualizacji MongoDB

  3. mongorestore Failed:brak osiągalnych serwerów

  4. Jak zaktualizować _id jednego dokumentu MongoDB?

  5. Przewodnik MongoDB BSON