2011-07-26 35 views
1

我有元素的列表MongoDB中有created_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]) 

但在這種情況下。我跳過所有文件與2所以我用「$ GTE」有這個文件nb_likes

獲得以前

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

獲得下一

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

但在這種情況下。第二個元素總是返回。在next和previous元素中。

如果我只限制與「created_at」少跌多文檔比我的文件我刪除一些文件與更多的「nb_likes」,但一個老「created_at」

所以我不知道什麼要求,我需要做的有良好的回報。

一個很好的解決方案是有這個文件的位置在我的完整列表,並做了skip()limit(1)

我向所有人開放的好辦法。我不知道在SQL中我們是否可以有相同的問題。

+0

爲什麼id爲1235元就是1236元 '前'? –

+0

默認情況下,第二個排序是關於:created_at你可以使用sort(['nb_likes': - 1],['created_at':1])來模擬它。'當兩個元素的順序相同時默認是這樣做的 – shingara

+0

什麼是Mongo查詢獲取您給出的有序列表(文檔)作爲示例?如果您的nb_likes大於2且id小於document_id,則 –

回答

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

後來編輯

通用的解決方案:

假設你有一個有序列表,給出/查詢返回(蒙戈,SQL,它並不怎樣都無所謂)。查詢有一種條款,即有如下形式:

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

申請我的解決方案的情況下,第二順序列created_at 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) 
+0

無法工作。所以你可能會得到一些不好的結果:( – shingara

+0

那麼你的排序標準是什麼?如果X.nb_likes = Y.nb_likes,那麼你如何確定元素X是否爲Y元素? –

+0

這是第二種做差異的方式,created_at是但是我不能僅僅在元素相同的情況下對第二個元素進行查詢 – shingara

相關問題