2012-06-06 70 views
53

我想知道集合中的最新記錄。怎麼做?從mongodb集合中獲取最新記錄

注:我知道下面的命令行查詢作品:

1. db.test.find().sort({"idate":-1}).limit(1).forEach(printjson); 
2. db.test.find().skip(db.test.count()-1).forEach(printjson) 

其中IDATE有時間戳增加。

問題在於收集數據的時間越來越長,我的「測試」集合真的非常龐大。我需要一個持續時間響應的查詢。

如果有更好的mongodb命令行查詢,請告訴我。

回答

17

我需要一定的時間響應

默認情況下查詢,MongoDB中的索引是B-樹。搜索B樹是O(logN)操作,所以即使find({_id:...})也不會提供恆定的時間O(1)響應。

這表明,如果您使用ObjectId作爲您的ID,您還可以按_id排序。 See here for details。當然,即使這只是在最後一秒。

你可以訴諸「寫兩遍」。一次寫入主集合並再次寫入「最後更新」集合。如果沒有交易,這不會是完美的,但只有一個項目在「最後更新」的集合中,它總是很快。

+2

我看到很多的NoSQL和MongoDB解決方案倡導 「寫兩次」,多爲計數時持有數據的大小變得非常大。我猜這是常見的做法? – Vinny

+0

MongoDB不會經常刷新到磁盤,它沒有事務,所以寫入速度顯着加快。這裏的權衡是鼓勵你去規範數據,這往往導致多次寫入。當然,如果你得到10倍或100倍的寫入吞吐量(我已經看到),那麼2倍或3倍的寫入仍然是一個很大的改進。 –

14

這會給你一個collection

db.collectionName.findOne({}, {sort:{$natural:-1}}) 

​​最後一個文件是指爲了記錄插入到一​​個相對的

編輯:對於所有的downvoters,上面是一個Mongoose語法, mongo CLI的語法是:db.collectionName.find({}).sort({$natural:-1}).limit(1)

+6

你的語法似乎是錯誤的。我無法像你一樣使用它。什麼工作是: 'db.punchdeck。findOne({$ query:{},$ orderby:{$ natural:-1}})' –

+0

不確定,爲什麼所有的downvotes - 這段代碼對我來說都很完美,而且很快 –

+1

@dark_ruby你查詢返回錯誤「$ err「:」Can not canon canonicalize query:BadValue Unsupported projection option:sort:{$ natural:-1.0}「, –

78

這是對上一個答案的重新考慮,但它更可能w ork在不同的mongodb版本上。

db.collection.find().limit(1).sort({$natural:-1}) 
+6

'db.collection.find()。limit(1).sort({$ natural:-1} ).pretty()'如果你想讓它看起來不錯 – Antoine

+0

所以,這個順序有什麼區別:'''db.collection.find()。sort({$ natural:-1})。limit(1)。 pretty()''' – Leo

+0

@Digits如果我們在最後限制了最後一個記錄的提取方式,那麼它會對性能產生什麼樣的影響,如果將輸出限制爲只有一個文檔,並且它必須是集合中的頂級文檔。 –

-1

php7.1的MongoDB:
$data = $collection->findOne([],['sort' => ['_id' => -1],'projection' => ['_id' => 1]]);

0

我的解決方案:

db.collection("name of collection").find({}, {limit: 1}).sort({$natural: -1})