2

mongodb コレクションのドキュメント構造の例を示しています。私が示したクエリを作成しているときに、期待される結果も示しました。

ドキュメントの構造::

{ 
  _id : "132423423", 
  name : "hi_code", 
  my_entries : [ 
        { 
          e_id : "12345", 
          e_name : "f1", 
          e_posted : "2010-05-01", 
        }, 
        { 
          e_id : "12346", 
          e_name : "f2", 
          e_posted : "2010-06-01", 
        }, 
        { 
          e_id : "12346", 
          e_name : "f3", 
          e_posted : "2010-03-02", 
        } 
   ] 
} 

クエリ構造::

db.myCollection.find( { my_entries : { $elemMatch : { e_posted : "2010-06-01", 
e_name : "f2" } } } ) 

期待される結果::

{ 
  _id : "132423423", 
  name : "hi_code", 
  my_entries : [ 
        { 
          e_id : "12346", 
          e_name : "f2", 
          e_posted : "2010-06-01", 
        }
   ] 
} 

これには map reduce を使用したくありません。これは、パフォーマンスが低下する大きなデータベースで作業しているためです。検索クエリでのみ可能にしたいだけです。

4

1 に答える 1

3

実際の結果は、クエリに一致するドキュメント全体です。

ドキュメントの一部のみが返されることを期待していますが、2.0 では、一致する配列要素のみが返されるように指定する方法はありません。

バージョン 2.2 (現在、不安定な開発バージョン 2.1 として利用可能な次の製品バージョン) から、集計フレームワークを使用して、この例で必要なものを取得できます。

2.2 は、射影演算子として $elemMatchもサポートしています。これは、最大で1 つの一致する配列要素を返すことに注意してください。

集約フレームワークを使用すると、次のようなことができます。

db.myCollection.aggregate( [
     {$match : { my_entries : { $elemMatch : { e_posted : "2010-06-01", e_name : "f2" } } } },
     {$unwind : "$my_entries"},
     {$match : { my_entries : { e_posted : "2010-06-01", e_name : "f2" } } }
] )

これにより、すべての my_entries 配列に一致するエントリがあるのと同じ数のドキュメントが返されます。それらをグループに戻したい場合{$group:}は、パイプラインの最後にエントリを追加する必要があります。

于 2012-06-05T05:24:45.720 に答える