2012-09-17 32 views
0

MongoDB排序功能是相當neato。你可以在與數據庫本身無關的對象和/或數組上使用它們嗎?Node.JS MongoDB排序/過濾功能是否可在數據庫之外使用?

var mongo  = require('mongodb'), 
    Server  = mongo.Server, 
    Db   = mongo.Db, 
    sortingFun = mongo.internalSortFilterFunction(); // By the miracle of imagination, this is a made-up line. 

有,例如,所謂的this awesome little node projectsiftMongoDB的啓發陣列過濾。但是還有更多類似的工具,不同的意見和項目合併和消失。

考慮到它的受歡迎程度,MongoDB很可能會流連忘返。出於這個原因,加上額外的好處是完全相似,而不是非常相似,我想知道是否可以從require('mongodb')連接node-mongodb中的特定對象/模型/函數,專門用於在自定義對象/陣列。

回答

0

排序在mongo服務器中完成,而不是客戶端。這也不是特別快 - 大集合應該預先排序,但這是另一個問題。

mongo服務器是用C++編寫的afaik,它使用自定義類型,與JS引擎分開,稱爲BSON。

因此,如果在客戶端上沒有爲javascript執行排序實現,這將是一個荒謬的功能,您不能使用服務器排序。

編輯:如果你確實真的想使用排序,性能會被詛咒,你可以插入js對象到數據庫中,有效地將它們轉換爲mongo集合中的BSON。然後對其進行分類並從數據庫中提取。索引等將需要重新創建該函數的每個調用。 Mongodb也拒絕爲大集合sans指數排序(限制1000左右的某個地方我相信)

PS。我還沒有讀到源代碼。我無法想象一個JS實時無索引排序,它與MongoDB的排序速度相匹配。分發時(分片)。但是你可以在C++中編寫node.js模塊,如果BSON與V8 JS對象相似(不這麼認爲),你可能可以移植它。我不會走這條路,因爲與在JS中重新實現它相比,這可能不會是一個大的速度增加,重新實現會更容易創建和維護。

+0

謝謝。明確。除了在Mongo查詢之後在內存中有特定的小集合,並且希望以幾種不同的方式過濾這些集合,那就是基於JS的排序派上用場了,並且使用像'sift'這樣的MongoDB排序克隆,您可以 - 首先使用您將提供給MongoDB的過濾器對象。 – Redsandro

+0

關於編輯的最後一行:是否需要對每個可排序字段進行索引?是否需要對每個可過濾字段進行索引? – Redsandro

+1

@Redsandro是的,我猜想,內存中的排序對JS很有用。但是mongodb提供這種功能的可能性不大 - Mongo的JS實際上只是一個客戶端。 關於索引的排序和過濾:一個可排序的字段/應該/被索引,但/必須/當文檔太多時被索引。我不認爲這同樣適用於過濾字段(我從來沒有使用過濾器,但我認爲它映射爲與我使用的$ exists相同)。索引它們只是爲了確定,就是我所做的。 – sapht

相關問題