2016-09-18 62 views
-2

從教程那裏我知道我可以在流星在這樣的請求排序的MongoDB集合:如何對MeteorJS中的MongoDB集合進行永久排序?

// Sorted by createdAt descending 
Users.find({}, {sort: {createdAt: -1}}) 

但我覺得這個解決方案是不是在性能視圖最佳。 因爲如果我理解它是正確的,那麼每當有請求Users時,都會請求原始集合,然後一遍又一遍地重新排序。

因此,一勞永逸地排序整個集合,然後通過Users.find()訪問已經排序的集合更好嗎?

問題是:我如何對整個集合進行永久排序而不僅僅是找到的結果?

+1

*「對整個集合進行排序」*在MongoDB中沒有意義,根據它的文檔,它不能保證*檢索時的排序順序。 – jonrsharpe

回答

1

這是MiniMongo的一個known limitation,Meteor的客戶端實現(的一部分)的MongoDB功能。

「排序」一個MongoDB 集合並沒有真正的一致含義。它並沒有轉化爲一套具體的行動。你會怎樣分類?是否有一種「自然」的方式來對一組結構可能不同的文件進行排序?

用於使數據檢索更有效的機制是索引。如果可能,在服務器上使用索引來輔助排序:

在MongoDB中,排序操作可以通過基於索引中的排序檢索文檔來獲取排序順序。如果查詢計劃程序無法從索引獲取排序順序,則會將結果排序在內存中。使用索引的排序操作通常比沒有使用索引的排序操作有更好的性能。另外,不使用索引的排序操作在使用32 MB內存時會中止。

(來源:MongoDB documentation

作爲一個集合不具有內在爲了它,它包含有關MongoDB中的訂貨要求信息的實體是一個光標。遊標可以被多次獲取,並且理論上可以被製作成有效的有序數據獲取器。

不幸的是,目前情況並非如此。 MiniMongo目前實施的方式沒有索引,也不會按訂單緩存文檔。每次獲取光標時都會對它們進行重新排序。

排序是相當有效的(儘管排序可以是有效的,排序函數調用),但是對於大型數據集來說,它可能會相當長並降低用戶體驗。目前,如果您有一個特殊用例需要重複訪問以相同方式排序的大型數據集,那麼您可以嘗試通過觀察遊標並在發生更改時更新緩存。

相關問題