2

私は個人的なプロジェクトに取り組んでおり、すべてのオブジェクトを丸めた日付で同じ時間にグループ化する必要があります。問題は、何かを集約したくないということです。

私はmongodbに次の形式のデータストアを持っています

{ 
   "_id" : ObjectId("4d663451d1e7242c4b68e000"), 
   "date" : "Mon Dec 27 2010 18:23:22 GMT+0000 (UTC)", 
   "name" : "james"
}, { 
    "_id" : ObjectId("4d6634514cb5cb2c4b69e000"), 
    "date" : "Mon Dec 27 2010 18:47:53 GMT+0000 (UTC)", 
    "name" : "bond", 
}, { 
    "_id" : ObjectId("4d6634514cb5cb2c4b69e000"), 
    "date" : "Mon Dec 27 2010 21:51:23 GMT+0000 (UTC)", 
    "name" : "bruce", 
}

次の形式で結果を探しています

{
   "rounded_date" : "Mon Dec 27 2010 18:00:00 GMT+0000 (UTC)",
   "items" : [ { 
           "_id" : ObjectId("4d663451d1e7242c4b68e000"), 
           "date" : "Mon Dec 27 2010 18:23:22 GMT+0000 (UTC)", 
           "name" : "james"
       }, { 
           "_id" : ObjectId("4d6634514cb5cb2c4b69e000"), 
           "date" : "Mon Dec 27 2010 18:47:53 GMT+0000 (UTC)", 
           "name" : "bond", 
       }
   ]
}, {
    "rounded_date": Mon Dec 27 2010 21:00:00 GMT+0000 (UTC),
    "items" : [ { 
            "_id" : ObjectId("4d6634514cb5cb2c4b69e000"), 
            "date" : "Mon Dec 27 2010 21:51:23 GMT+0000 (UTC)", 
            "name" : "bruce", 
        }
    ]
}

助けてくれてありがとう。

4

2 に答える 2

4

これは、集約フレームワーク(mongoDB 2.2の新機能)の適切な候補のように見えます。唯一の注意点は、現時点では新しい日付をその場で作成できないことですが、日付から必要なデータを抽出してグループ化することはできます。

次の例を参照してください。

# Load the sample data
db.datetest.save({ 
   "_id" : ObjectId("4d663451d1e7242c4b68e000"), 
   "date" : ISODate("2010-12-27T18:23:22Z"),
   "name" : "james"
});

db.datetest.save({ 
    "_id" : ObjectId("4d6634514cb5cb2c4b69e000"), 
    "date" : ISODate("2010-12-27T18:47:53Z"),
    "name" : "bond", 
});

db.datetest.save({ 
    "_id" : ObjectId("4d6634514cb5cb2c4b69e001"), 
    "date" : ISODate("2010-12-27T21:51:23Z"),
    "name" : "bruce", 
});

次に、集計を実行します。最初に、ドキュメントを有用な形式に再投影します。

db.datetest.aggregate(
    {$project: {
        hour: {0: {"$year": "$date"},
               1: {"$month": "$date"},
               2: {"$dayOfMonth": "$date"},
               3: {"$hour": "$date"}},
        item: {
            _id: "$_id",
            date: "$date",
            name: "$name"
        }
    }},
    {$group: {
        _id: "$hour",
        items: {$push: "$item"}
    }}
)

集計の説明:

  1. ここではhour、日付から抽出された年、月、日、および時間を使用してサブドキュメントを作成します。itemまた、 groupbyで使用するサブドキュメントを作成します。
  2. グループ化して、すべてのドキュメントを配列にhourプッシュします。itemitems

結果は次のようになります。

{
  "result" : [{
    "_id" : { "0" : 2010, "1" : 12, "2" : 27, "3" : 21 },
    "items" : [
      {
        "date" : ISODate("2010-12-27T21:51:23Z"),
        "name" : "bruce"
      }
    ]}, {
    "_id" : {"0" : 2010, "1" : 12, "2" : 27, "3" : 18},
    "items" : [{
        "date" : ISODate("2010-12-27T18:23:22Z"),
        "name" : "james"
      }, {
        "date" : ISODate("2010-12-27T18:47:53Z"),
        "name" : "bond"
      }
    ]}
  ],
  "ok" : 1
}
于 2012-09-07T09:13:38.817 に答える
0

私は別の解決策を見つけました:

db.collection.group({
    cond: {'public': true},
    keyf: function(doc) {
        var date = doc.when
        date.setMinutes(0,0,0);
        return {'date' : date};
    },
    initial: { items:[] },
    reduce: function(doc, out) { out.items.push(doc); }
});

問題は、groupby を使用した後に何かをソートすることは不可能です。クライアント側でそれを行う必要があると思います。

于 2012-09-07T13:45:38.150 に答える