0

これが私が取り組んでいるものです:

{
    "_id": ObjectId("53b4402ae1382335c95952d3"),
    "created": ISODate("2014-07-02T10:23:54.245Z"),
    "modified": ISODate("2011-11-28T10:06:25.186Z"),
    "source": [{
        "instances": [{
            "analyst": "harry",
            "date": ISODate("2014-07-02T10:23:54.242Z"),
            "reference": "abb32"
        },
        {
            "analyst": "david",
            "date": ISODate("2014-07-02T10:33:02.296Z"),
            "reference": "can26"
        }],
        "name": "Apples"
    },
    {
        "instances": [{
            "analyst": "critsAPI",
            "date": ISODate("2011-11-28T10:06:25.156Z"),
            "reference": "z561c"
        }],
        "name": "Oranges"
    }],
    "releasability": [],
}

私が望むのは、特定の名前とともに特定の範囲(月としましょう)の「インスタンスの日付」を持つすべてのドキュメントの数です。「elemMatch」で 2 つのクエリを使用しましたが、残念ながら期待した結果が得られません。elemMatch と instances.date を使用して試したことは次のとおりです。

    collection.find(
                    {
                    'source':
                      {
                        '$elemMatch' : {
                              'name':'Apples',
                              'instances.date' : {'$lte' :   ISODate("2014-07-30T00:00:00Z") ,    
                                                 '$gte' :  ISODate("2014-07-01T00:00:00Z")}
                       }
                       }
                       }
                        ).count()

ネストされた elemMatch を次に示します。

    collection.find(
                    {
                    'source':
                      {
                        '$elemMatch' : {
                              'name':'Apples',
                              'instances': {
                                  '$elemMatch' : {
                                       'date' : {'$lte' :   ISODate("2014-07-30T00:00:00Z") ,    
                                                 '$gte' :  ISODate("2014-07-01T00:00:00Z")}
                       }
                       }
                       }
                       }
                       }
                        ).count()

前もって感謝します。

4

2 に答える 2

0

メソッドは配列要素の数ではなく、ドキュメントの数を返すため、あなたはcount()1を取得していると思います。count()

(上記のドキュメントに基づいて) 2 の結果を得るには、Aggregation Framework を使用する必要があります。

次のようなことを試してください。

    db.coll1.aggregate([
        {$unwind : "$source"},
        {$unwind : "$source.instances"},
        {$一致: {
            $and: [
            {"source.name" : "りんご"},
            {"source.instances.date" : {"$lte" : ISODate("2014-07-30T00:00:00Z")}},
            {"source.instances.date" : {"$gte" : ISODate("2014-07-01T00:00:00Z")}}
                  ]
        }}、
        {$プロジェクト: {
            name1: "$source.name",
            date1: "$source.instances.date"
        }}、
            {$group : {_id: "$name1", name1: {$sum:1}}}
        ]))
    
そして、シェルで次のようになります { "result" : [ { "_id" : "Apples", "name1" : 2 } ], "ok" : 1 }

$unwind配列を個別のドキュメントに分割$matchし、選択を行い$project、結果フィールドを定義し ( SELECTSQL の句に似ています)、$groupエントリを合計します (SQL の 'GROUP BY` に似ています)。

集約パイプラインのこれらの個々のステップは、ドキュメントの結果セットを順次フィルタリング/変換します。

それが役立つことを願っています

于 2015-02-28T05:52:04.850 に答える