1

次のようなmongodbコレクションにいくつかのデータが保存されています。

{"_id": 1, "category": "food", "name": "chips", "price": 1.50, "effectiveDate": ISODate("2013-03-01T07:00:00Z")} 
{"_id": 2, "category": "food", "name": "chips", "price": 1.75, "effectiveDate": ISODate("2013-03-05T07:00:00Z")}
{"_id": 3, "category": "food", "name": "chips", "price": 1.90, "effectiveDate": ISODate("2013-03-10T07:00:00Z")}
{"_id": 4, "category": "beverage", "name": "pop", "price": 2.00, "effectiveDate": ISODate("2013-03-01T07:00:00Z")}
{"_id": 5, "category": "beverage", "name": "pop", "price": 2.25, "effectiveDate": ISODate("2013-03-05T07:00:00Z")}
{"_id": 6, "category": "beverage", "name": "pop", "price": 1.80, "effectiveDate": ISODate("2013-03-10T07:00:00Z")}

mongodb で、特定の日付にアクティブだったドキュメントをカテゴリ別にグループ化して返すクエリを作成するにはどうすればよいでしょうか?

2013 年 3 月 6 日を指定した場合、結果は次のようになります。

{"_id": 2, "category": "food", "name": "chips", "price": 1.75, "effectiveDate": ISODate("2013-03-05T07:00:00Z")}
{"_id": 5, "category": "beverage", "name": "pop", "price": 2.25, "effectiveDate": ISODate("2013-03-05T07:00:00Z")}

私はmongoを初めて使用し、group、aggregate、およびmapreduceを使用してこれを実行しようとしましたが、ぐるぐる回っているだけです。

4

1 に答える 1

1

本当に良い答えを得るには、あなたのコードとあなたが何をしようとしているのかの詳細が必要です. しかし、私の理解が正しければ、集計フレームワークのみを使用してそれを解決できると思います。集約フレームワークはパイプラインの概念を使用していることを知っておく必要があります。つまり、各ステップの結果は次のエントリとして使用されます。

私のクエリ:

db.yourcollection.aggregate([

    /* First exclude everything that is superior to a given date */
    {$match:{effectiveDate:{$lte:new Date(2013,2,6)}}},

    /* Sort the rest by date, descending */
    {$sort:{effectiveDate:-1}},

    /* Group by name+category and grab only the first result
       (the newest below that date) */
    {$group:{_id:{name:'$name',category:'$category'}, effectiveDate:{$first:"$effectiveDate"},price:{$first:"$price"}}},

    /* You said you want the results grouped by category.
       This last $group does that and returns all matching products inside an array
       It also removes the duplicates */
    {$group:{_id:'$_id.category',products:{$addToSet:{name:"$_id.name",price:"$price",effectiveDate:"$effectiveDate"}}}}

])

出力は次のようになります。

{
    "result": [
        {
            "_id": "food",
            "products": [
                {
                    "name" : "chips",
                    "price" : 1.75,
                    "effectiveDate" : ISODate("2013-03-05T07:00:00Z")
                }
            ]
        },
        {
            "_id" : "beverage",
            "products": [
                {
                    "name" : "pop",
                    "price" : 2.25,
                    "effectiveDate" : ISODate("2013-03-05T07:00:00Z")
                }
            ]
        }
    ],
    "ok":1
}

最後を変更する$groupか、$project

于 2013-03-15T19:53:58.893 に答える