2015-03-15 5 views
2

Я внедряю систему ранжирования. У меня есть коллекция с элементами, как это:Как запросить соседние элементы в MongoDB?

{"_id" : 1, "count" : 32} 
{"_id" : 2, "count" : 12} 
{"_id" : 3, "count" : 34} 
{"_id" : 4, "count" : 9} 
{"_id" : 5, "count" : 77} 
{"_id" : 6, "count" : 20} 

Я хочу написать запрос, который возвратит элемент, который имеет {"id" : 1} и 2 других соседних элементов (после сортировки по количеству). Всего было возвращено 3 элемента.

Ex: После сортировки:

9 12 20 32 34 77 

Запрос должен возвращать 20 32 34.

ответ

4

Вы никогда не получите это в одной операции запроса, но его можно получить с помощью «трех» запросов. Первый, чтобы получить значение для «count» из нужного элемента, а последующие - для «предшествующих» и «следующих» значений.

var result = []; 
var obj = db.collection.findOne({ "_id": 1 }); // returns object as selected 
result.push(obj); 
// Preceding 
result.unshift(db.collection.findOne({ 
    "$query": { "count": { "$lt": obj.count } }, 
    "$orderby": { "count": -1 } 
})); 
// Following 
result.push(db.collection.findOne({ 
    "$query": { "count": { "$gt": obj.count } }, 
    "$orderby": { "count": 1 } 
})); 

Просить, чтобы сделать это в «одном запросе» по существу просить «присоединиться», которая является то, что MongoDB по существу не делает. Это дискретные результаты "Set Intersection", а в SQL - это, в основном, операция объединения.

+0

Большое спасибо за ваше объяснение, Я думал об использовании 3 запросов раньше, но я надеялся, что будет лучший способ сделать все эти вещи всего за один запрос. Я представляю таблицу ранжирования для каждого сообщения, так что эти 3 запроса очень дороги T.T –

Смежные вопросы