3

これについてここにいくつかの投稿がありますが、正確には私が求めているものではありません。

埋め込みドキュメントのリストを含むドキュメントがあります。

{
   "_id": 1234
   "name": "joe"
   "comments": [
       {"type": "text", "content": "my content"},
       {"type": "image", "content": "my_content"}
       {"type": "image", "content": "my_content"}
   ]

}

ドキュメントのセットを取得する 1 つのクエリを実行したいので、2 次クエリを実行して、最初のクエリ セットから「コメント」リストを検索することを望んでいました。

たとえばp = db.people.find({"some":"condition"})、次のような埋め込みドキュメントを検索しますp.find({"type":"image"}

これは明らかに機能しません。親ドキュメント コレクションに対して 2 つの個別のクエリを再度実行することなく、これを行う方法があるかどうか疑問に思っていますか?

4

2 に答える 2

4

特定の条件を満たすコレクション内のアイテムを検索し、配列内で満たしたい場合は、1 つのクエリでそれを行うことができます。{"type": "image"}comments

p = db.people.find({"some": "condition", "comments.type": "image"})

詳細については、ドット表記のページを参照してください。

実際にすべてが必要で、上記の結果の特定のサブアイテムに興味がある場合、私が考えることができる最良の方法は、結果をリストに丸呑みし、Python でチェックすることです。PyMongo の達人はこれについて何か言いたいことがありますか? データセットが大きい場合、これはお勧めできません。

p = list(db.people.find({"some": "condition"})

# A little verbose, but...
image_p = [item for item in p
           if any(comment['type'] == 'image'
                  for comment in item['comments'])]

...
于 2012-10-24T21:53:08.910 に答える
1

findドット表記のみを使用する場合の問題は、サブドキュメントだけでなく常にドキュメント全体を取得することです。

Aggregationを使用できるようにするには、mongodb 2.2 を使用します。

ここを見て

注意: $ElementMatchは、位置要素 ( ) と一緒に使用すると反復しませんsomething.$.someattribute。最初のドキュメントが一致した直後に終了するため、集計を使用して、一致するすべてのサブドキュメントを取得します :)

于 2012-10-24T22:38:22.867 に答える