Как узнать, является ли предыдущий / следующий элемент сортировки целочисленных значений ни одним уникальным - PullRequest
1 голос
/ 26 июля 2011

У меня есть список элементов в MongoDB с данными create_at и nb_likes, как в этом случае:

[{'_id':'1234', 'nb_likes':1, 'created_at':'2010-08-01'},
 {'_id':'1235', 'nb_likes':2, 'created_at':'2010-08-02'},
 {'_id':'1236', 'nb_likes':2, 'created_at':'2010-08-03'},
 {'_id':'1237', 'nb_likes':3, 'created_at':'2010-08-02'},
 {'_id':'1238', 'nb_likes':3, 'created_at':'2010-08-03'}]

Если я отсортирую эту коллекцию по порядку 'nb_likes'.

db.users.find().sort(['nb_likes':-1])

Но я хочу найти предыдущий и следующий элемент документа '1236', если я закажу 'nb_likes'.Если мы видим коллекцию, предыдущий элемент - это документ «1235», а следующий «1237».Но если я хочу сделать запрос, чтобы узнать предыдущий и следующий элемент, я делаю:

, чтобы получить предыдущий

db.users.find({'nb_likes':{'$gt':2}}).sort(['nb_likes':-1])

, чтобы получить следующий

db.users.find({'nb_likes':{'$lt':2}}).sort(['nb_likes':1])

Но в этомдело.Я пропускаю весь документ с nb_likes с 2. Поэтому я использую $ gte, чтобы получить этот документ

, чтобы получить предыдущий

db.users.find({'nb_likes':{'$gte':2}}).sort(['nb_likes':-1])

, чтобы получить следующий

db.users.find({'nb_likes':{'$lte':2}}).sort(['nb_likes':1])

Но в этом случае.второй элемент всегда возвращается.в следующем и предыдущем элементе.

Если я ограничиваю только документ с «create_at» меньше или больше, чем мой документ, я удаляю некоторый документ с большим количеством «nb_likes», но со старым «made_at»

Такне могу знать, какой запрос мне нужно сделать, чтобы получить хороший возврат.

Хорошее решение - указать позицию этого документа в моем полном списке и сделать skip() и limit(1)

Я открыт ко всему хорошему решению.Я не могу знать, может ли быть в SQL такая же проблема или нет.

1 Ответ

0 голосов
/ 26 июля 2011
var prev = db.users.find({'nb_likes': {$lte: 2}, '_id': {$lt: 1236}}).sort({'nb_likes': -1})
var next = db.users.find({'nb_likes': {$gte: 2}, '_id': {$gt: 1236}}).sort({'nb_likes': 1})

Позднее редактирование

Универсальное решение:

Допустим, у вас есть упорядоченный список, полученный / возвращенный запросом (Mongo, SQL, в любом случае это не имеет значения). Запрос имеет предложение sort, которое имеет вид:

sort_clause = 
  kw1: order,
  kw2: order,
...

, где order может быть DESC или ASC.

Я определю оп (порядок):

<=, if order is DESC
>=, if order is ASC

Теперь, чтобы получить следующий элемент E, вам нужно создать запрос, подобный:

SELECT select_clause
WHERE 
   kw1 op(order) E.kw1,
   kw2 op(order) E.kw2,
   ...
ORDER BY sort_clause
OFFSET 1
LIMIT 1

Аналог предыдущего элемента.

Позже редактировать 2

Чтобы применить моё решение в случае, если создан второй столбец заказа: asc:

var prev = db.users.find({'nb_likes': {$lte: 2}, 'created_at': {$lte: '2010-08-03'}}).sort({'nb_likes': -1, 'created_at': -1}).skip(1).limit(1)
var next = db.users.find({'nb_likes': {$gte: 2}, 'created_at': {$gte: '2010-08-03'}}).sort({'nb_likes': 1, 'created_at': 1}).skip(1).limit(1)
...