2011-09-26 6 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

P.S. near見つかりました: "新しいフィールドを追加してカテゴリのサイズを指定します。これはmongo worldの通常の方法です。" これは本当ですか?

答えて

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 } }); 

:その配列は、単に1つの要素を有しているので{[「FOO」]}、 次の例では、オブジェクトに一致することになりますたとえば、要素数が1より大きい配列 )。あなたは範囲を照会する必要がある場合、あなたは

「0より大きい」のようなもののために配列サイズ0をチェックすることはできませんが、あなたが要素

を追加するときにインクリメント 余分なサイズのフィールドを作成

0
  1. 趣味が唯一見つからない場合、趣味のない人に趣味のキーが設定されていない場合は、EXISTSフラグを使用します。 パフォーマンス向上のために「趣味」のインデックスを追加してください:

    db.collectionfind({趣味:{$ exists:true}});ゼロ趣味を有する人は、空の配列を有し、そして1つの趣味を有する人は、1つの要素の配列を有する場合

  2. しかし、この一般的な解決策を使用:

を(「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

関連する問題