2016-04-30 184 views
0

如果我有這樣的如何按照在MongoDB中的值對字段中的對象進行排序?

{ 
    "_id" : "word", 
    "nextWords" : { 
     "x" : 3, 
     "y" : 2, 
     "z" : 1, 
     "h" : 1, 
     "n" : 10 
    } 
} 

一個文件,我想在一個降序排序「nextWords」返回的對象。

我可以在MongoDB Shell或Java中執行該操作嗎?

編輯:我想根據其價值降序排序「nextWords」,所以預期成果是:

{ 
    "n" : 10 
    "x" : 3, 
    "y" : 2, 
    "z" : 1, 
    "h" : 1, 
} 
+0

{$ 推:{ :{$ 每個:,...], $排序:<排序規範> }} } 請 – Robus

+0

你能更詳細?我應該在哪裏通過這個?如果它是一個更新操作,我希望它被應用於整個文檔,我認爲這將很難寫 –

+0

簡而言之:你不能使用這個數據模型。字段返回的順序完全是任意的。您需要在代碼中以編程方式進行排序。 –

回答

-1

可以轉而做如下

{「_id」: 「字」, 「nextWords」:[{ 「字」: 「X」, 「計數」:3},....]}

使用此映射減少:

String map = "function() { for(i in this.nextWords)emit(i.word,i.count) } 

String reduce = "function(key,value){return (value);}"; 

在Java運行它:

MapReduceCommand cmd = new MapReduceCommand(collection, map, reduce, null, MapReduceCommand.OutputType.INLINE, null); 

MapReduceOutput out = collection.mapReduce(cmd); 

for (DBObject o : out.results()) { 
     // here put them in an array 
    } 

//數組

+0

發出的值的順序可能不一定是順序的。而你的地圖縮小並不能改變這個事實。此外,對於這種結構,map/reduce是完全不需要的,因爲'db.words.aggregate({$ unwind:「$ nextWords」},{$ sort:{「$ nextWord.count」: - 1}},{ $ group:{_ id:「$ word」,sorted:{$ push:「$ nextWord」}}})'會做同樣的事情,再加上你放入代碼的迭代。 –

+0

我是這麼寫的,因爲在java中使用mongodb的api使得很難訪問嵌套的子文檔。 HTTP://計算器。com/questions/3985214 /只能檢索查詢元素的對象數組in-mongodb-collection –

+0

您可以使用Java驅動程序進行聚合。 ;)我懷疑你需要一個m/r來訪問子目錄。 –

0

JSON對象沒有進行排序。從the specs第4.3.3節:

對象是Object類型的成員。它是一個無序的屬性集合,其中每個屬性都包含一個原始值,對象或函數。存儲在對象屬性中的函數稱爲 方法。

您不能依賴字段的順序,但不能保證。

相關問題