2011-09-26 40 views
7

數據庫接近5GB。我有這樣的文件:Mongo DB:如何選擇嵌套數組數> 0

{ 
    _id: .. 
    user: "a" 
    hobbies: [{ 
     _id: .. 
     name: football 
    }, 
    { 
     _id: .. 
     name: beer 
    } 
    ... 
    ] 
} 

我要回誰擁有更多的則0「愛好」 用戶我試過

db.collection.find({"hobbies" : { &gt : 0}}).limit(10) 

,它需要所有的RAM和沒有結果。

  1. 如何進行此選擇?
  2. 如何僅返回:id,name,count?
  3. 如何用c#官方驅動程序做到這一點?

TIA

附: near我找到了: 「爲hande分類大小添加新字段,這是mongo世界的慣例。」 這是真的嗎?

回答

8

您是否嘗試過使用hobbies.length。我沒有測試過這一點,但我相信這是查詢數組範圍MongoDB中

db.collection.find({$where: '(this.hobbies.length > 0)'}) 
+0

此工作的 - 但對少量的數據。對於我的任務,似乎我應該保持「計數」變量。 – 1gn1ter

1

Earlier questions說明如何處理數組計數問題。雖然在你的情況下,如果ZERO真的是你想要測試的唯一值,你可以在數組爲空時將數組設置爲null,並設置不序列化它的選項,然後可以測試該字段的存在。記住要測試null,並在想要爲用戶添加興趣時創建數組。

對於#2,如果添加了計數字段,可以輕鬆地從數據庫中選擇要返回的字段幷包括計數字段。

2

這是有些錯誤。

根據手冊

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

$大小

的$大小操作者 元素的指定數量的任何陣列相匹配。由於該陣列僅具有一個元素, :

db.things.find({ a : { $size: 1 } }); 

不能使用$尺寸找到一個尺寸範圍(:下面的示例將匹配對象{[「foo」的]一個}例如:具有多於1個元素的數組 )。如果您需要查詢的範圍內,當你添加元素

所以,你可以檢查數組大小爲0,但不喜歡的事情「大於0」

創建你增加一個 額外的大小字段
0
  1. 如果您只需要找到零興趣愛好,並且如果沒有爲沒有愛好的人設置興趣密鑰,請使用EXISTS標誌。 在「業餘愛好」上添加索引以提升性能:

    db.collection。find({hobbies:{$ exists:true}});

  2. 然而,如果與零個愛好的人都有空數組,和人用1個愛好具有1個元件的陣列,然後使用此通用的解決方案:

維持一個名爲「HCOUNT」變量(愛好計數),並且在任何更新中始終將其設置爲與愛好陣列的大小相等。在球場上「HCOUNT」 指數然後,你可以做一個查詢:

db.collection.find({ hcount : 0 }) // people with 0 hobbies  
db.collection.find({ hcount : 5 }) // people with 5 hobbies 

3 - 從@JohnPs回答,「$大小」也是出於這個目的,一個好的運營商。 http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

16

在這種特殊情況下的正確方法,你可以用列表索引來解決問題:

db.collection.find({"hobbies.0" : {$exists : true}}).limit(10)

這只是確保第0個元素存在。您也可以通過檢查範圍末尾的元素的存在來確保列表的長度小於n或x和y之間的長度。

7

可以(排序的)檢查一系列陣列的長度與使用邏輯$not$size操作者:

db.collection.find({array: {$not: {$size: 0}}}) 
+0

對於具有非零大小的數組,這似乎是最適用的答案。 – Roddy