2011-09-11 18 views
0

私はmongodbの新しいハチです。 このようなネストされた配列ドキュメントを作成しました。その後入れ子配列で照会する方法(pymongoを使用)

data = { 
    "title": "mongo community", 
    "description": "I am a new bee", 
    "topics": [{ 
     "title": "how to find object in array", 
     "comments": [{ 
      "description": "desc1" 
     }] 
    }, 
    { 
     "title": "the case to use ensureIndex", 
     "comments": [{ 
      "description": "before query" 
     }, 
     { 
      "description": "If you want" 
     } 
     ] 
    } 
    ] 
} 

、「コミュニティ」に db.community.insert(データを)それを置く

ので、私はタイトルがでオブジェクトを検索する方法」であるトピック「コメント」を蓄積したいと思いますアレイ」 、私は試み、

データ= db.community.find_one({ "タイトル": "Mongoのコミュニティ"、 "topics.title": "配列内のオブジェクトを検索する方法"})

結果が

>>> print data 
{ 
    u 'topics': [{ 
     u 'comments': [{ 
      u 'description': u 'desc1' 
     }], 
     u 'title': u 'how to find object in array' 
    }, 
    { 
     u 'comments': [{ 
      u 'description': u 'before query' 
     }, 
     { 
      u 'description': u 'If you want' 
     }], 
     u 'title': u 'the case to use ensureIndex' 
    }], 
    u '_id': ObjectId('4e6ce188d4baa71250000002'), 
    u 'description': u 'I am a new bee', 
    u 'title': u 'mongo community' 
} 

である私はあなたが私に何かアドバイスを与えるWhould "ensureIndexを使用する場合" を

をトピックを必要としません。

thx。

答えて

3

トピックを1つのドキュメントにすべて埋め込んでいるようです。あなたはMongoDBから頻繁に部分文書を返すことを避けるべきです。あなたはfindメソッドの "fields"引数でそれを行うことができますが、それを頻繁にやっているのであればそれほど簡単ではありません。

これを解決するには、各トピックを別々のドキュメントにすることができます。それがあなたにとってもより簡単になると思います。フォーラムの「コミュニティ」に関する情報を保存する場合は、別のコレクションに入れてください。たとえば、monbodbシェルで次のように使用することもできます

// ad a forum: 
var forum = { 
       title:"mongo community", 
       description:"I am a new bee" 
      }; 
db.forums.save(forum); 

// add first topic: 
var topic = { 
       title: "how to find object in array", 
       comments: [ {description:"desc1"} ], 
       forum:"mongo community" 
      }; 
db.topics.save(topic); 

// add second topic: 
var topic = { 
       title: "the case to use ensureIndex", 
       comments: [ 
        {description:"before query"}, 
        {description:"If you want"} 
       ], 
       forum:"mongo community" 
      }; 
db.topics.save(topic); 

print("All topics:"); 
printjson(db.topics.find().toArray()); 


print("just the 'how to find object in array' topic:") 
printjson(db.topics.find({title:"how to find object in array"}).toArray()); 

はまた、MongoDBのでスキーマ設計に関する文書Trees In MongoDBを参照してください。それはあなたが作業しているものと同様のスキーマを使用しており、より高度なユースケースのためにそれに展開されています。

+0

ありがとうございますscott! –

+0

確かに事実です。これに関連して私があなたのために答えることができる何か他にありますか?もしそうなら、コメントを追加してください。すべてが答えられれば、答えとしてマークすることができれば素晴らしいことでしょう。 –

+0

非常にscottありがとう!それはとても簡単です。私は自分で問題を解決しません。私はMongoDBが豊富な文書であると信じられていました。しかし、私はそれを効果的に使うべきです。再度、感謝します! –

0

MongoDBは、つまり、書類上で動作し、トップレベルの文書(物事あなたsaveupdateinsertfind、およびfind_one上)。 Mongoのクエリ言語を使用すると、埋め込みオブジェクト内を検索できますが、これらのトップレベルのドキュメントのうちの1つ(またはそれ以上)を常に返す、更新する、または操作します。

MongoDBは「スキーマレス」と呼ばれることがよくありますが、「フレキシブルスキーマ」と「ドキュメントスキーマごと」のようなものは、より正確な説明になります。これは、コミュニティ内に直接埋め込まれたトピックを持つスキーマ設計がこの特定のクエリでは機能していない場合です。しかし、コミュニティ内のトピックを1つのクエリでリストするなど、このスキーマがより効率的にサポートする他のクエリがおそらく存在します。作成するクエリを検討し、それに応じてスキーマを再設計することもできます。

のMongoDB制限に関するいくつかの注意事項:

    (@scottが述べたように、必要に応じてフィールドのサブセットのみで - このトピックに関する the mongodb docsを参照してください)
  1. トップレベルの文書が常に返され
  2. 各ドキュメント16メガバイトのデータに制限されています(バージョン1以降)。コミュニティは、スキーマ設計のヘルプについてのトピック

の長いリストを持っている場合8+)ので、このスキーマがうまく動作しません、導入、ヒント、および考慮事項についてthe mongodb docs on schema designKyle Banker's video "Schema Design Basics"、およびEliot Horowitz's video "Schema Design at Scale"を参照してください。

+0

非常にdcrostaありがとうございました、ドキュメントはとても役立ちました。 –

関連する問題