2012-01-27 85 views
35

的長度可以說我有蒙戈的文件是這樣的:蒙戈爲了通過陣列

問題1

{ 
    answers:[ 
     {content: 'answer1'}, 
     {content: '2nd answer'} 
    ] 
} 

問題2

{ 
    answers:[ 
     {content: 'answer1'}, 
     {content: '2nd answer'} 
     {content: 'The third answer'} 
    ] 
} 

有沒有辦法訂購按答案大小收集?

經過一些研究,我看到了添加另一個字段的建議,該字段包含多個答案並將其用作參考,但可能有本地方法來執行此操作?

回答

40

我以爲你也許能​​夠使用$size,但這只是爲了找到一定大小的數組,而不是排序。

從蒙戈文檔: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

不能使用$大小找到各種尺寸(例如:數組有超過1元)。如果您需要查詢範圍,請創建一個額外的大小字段,以便在添加元素時增加。索引不能用於查詢的$ size部分,儘管如果包含其他查詢表達式,索引可用於搜索查詢表達式那部分的匹配。

看起來你也許可以很容易做到這一點與新的聚合框架,編輯:這還沒有出來。 http://www.mongodb.org/display/DOCS/Aggregation+Framework

更新現在聚合框架是出...

> db.test.aggregate([ 
    {$unwind: "$answers"}, 
    {$group: {_id:"$_id", answers: {$push:"$answers"}, size: {$sum:1}}}, 
    {$sort:{size:1}}]); 
{ 
"result" : [ 
    { 
     "_id" : ObjectId("5053b4547d820880c3469365"), 
     "answers" : [ 
      { 
       "content" : "answer1" 
      }, 
      { 
       "content" : "2nd answer" 
      } 
     ], 
     "size" : 2 
    }, 
    { 
     "_id" : ObjectId("5053b46d7d820880c3469366"), 
     "answers" : [ 
      { 
       "content" : "answer1" 
      }, 
      { 
       "content" : "2nd answer" 
      }, 
      { 
       "content" : "The third answer" 
      } 
     ], 
     "size" : 3 
    } 
    ], 
    "ok" : 1 
} 
+0

似乎是導致鬆散的文件沒有答案陣列。有時候可以。 – Oleg 2015-01-12 13:18:27

+0

有沒有辦法讓文件沒有答案?我喜歡@OlegGolovanov回答的'$ project'方式,但正如他正確地提到的,你必須手動添加所有需要的字段是我不喜歡的東西 – Jay 2015-12-03 14:25:42

22

我使用$項目是:

db.test.aggregate([ 
    { 
     $project : { answers_count: {$size: { "$ifNull": [ "$answers", [] ] } } } 
    }, 
    { 
     $sort: {"answers_count":1} 
    } 
    ]) 

它允許還包括空答案文件。 但也有缺點(或有時是有利的):你應該在項目步驟中手動添加所有需要的字段。

+2

你是英雄,它的工作原理! – Antoine 2016-03-29 00:55:27

+0

偉大的答案,作品像一個魅力 – samix73 2017-07-08 13:45:14