2016-08-24 5 views
2

mongoDBでグループ集計を使用して、作成日に基づいて文書をグループ化したいと考えています。私は作成日をフィールドとして保存しませんでしたが、私はObjectIdからこの日付を抽出できることを知っています。だから、私はこのような何か書き込もうとしました:objectIdという形式を抽出した作成日に基づいてMongoDBコレクションをグループ化する方法はありますか?

db.sales.aggregate(
    [ 
     { 
     $group : { 
      _id : { month: {$month: ObjectId("$_id").getTimestamp()}, 
        day: {$dayOfMonth: ObjectId("$_id").getTimestamp()}, 
        year: {$year: ObjectId("$_id").getTimestamp()} 
      }, 
      averageQuantity: { $avg: "$quantity" }, 
      count: { $sum: 1 } 
     } 
     } 
    ] 
) 

をそして、私はこのエラーを取得する: エラー:無効なオブジェクトID:長さ: (シェル)@:5:37

それは動作しますが、ときに私"$ _id"の代わりに特別なObjectIdを記述してください。たとえば、次のように のObjectId(「507c7f79bcf86cd7994f6c0e」)getTimestamp()

そしてそれはまた動作しますが、私は私の作成日時と書き込みを格納し、フィールドれている日付を持っている。このような何か:。

db.sales.aggregate(
    [ 
     { 
     $group : { 
      _id : { month: {$month: "$date"}, 
        day: {$dayOfMonth: "$date"}, 
        year: {$year: "$date"} 
      }, 
      averageQuantity: { $avg: "$quantity" }, 
      count: { $sum: 1 } 
     } 
     } 
    ] 
) 

しかし、私はObjectIdを使って直接タイムスタンプを取得する方法を知りたいです。

凝集によるグループとその関連データは、このリンクで見つけることがある:私の自動MongoDBのは、ID Sを生成して https://docs.mongodb.com/manual/reference/operator/aggregation/group/

しかし、私は、この例の簡単な整数のID Sを置き換えます。

+0

によって[集計のMongoDB結果の可能性の重複を与えるだろうObjectId date](http://stackoverflow.com/questions/18691689/aggregate-mongodb-results-by-objectid-date) –

答えて

0

getTimestamp()は関数であり、javascript関数内で使用する必要があります。

2つのことをクエリで修正する必要があります。 1つはIdの取得であり、もう1つはgetTimestamp()関数の使用です。

Retrieval of Id

_id : { month: {$month: ObjectId("$_id").getTimestamp()}, 
        day: {$dayOfMonth: ObjectId("$_id").getTimestamp()}, 
        year: {$year: ObjectId("$_id").getTimestamp()} 
     } 

月、日、年にIDを取得する正しい方法

_id : { month: "$_id.month", day: "$_id.day", year: "$_id.year"}, 

理由:

月には、文書IDの一部であるため、それを取得する必要がありますこちらです。同様に年と年。

Getting the Timestamp

結果をjavascriptループに入れ、getTimestamp()メソッドを使用します。あなたはjavascript関数で集計クエリを実行した後、この

{ 
     "_id" : { 
       "month" : ObjectId("57bd7d3c0da65e3f92328e50"), 
       "day" : ObjectId("57bd7d3c0da65e3f92328e51"), 
       "year" : ObjectId("57bd7d3c0da65e3f92328e52") 
     }, 
     "quantity" : 200 
} 

と結果のようなコレクションを持っている場合は

db.sales.aggregate(
    [ 
     { 
     $group : { 
      _id : { month: "$_id.month", day: "$_id.day", year: "$_id.year"}, 
      averageQuantity: { $avg: "$quantity" }, 
      count: { $sum: 1 } 
     } 
     } 
    ] 
).forEach(function (doc) 
    { 
    doc["doc._id.month"]=doc._id.month.getTimestamp(); 
    doc["doc._id.day"]=doc._id.day.getTimestamp(); 
    doc["doc._id.year"]=doc._id.year.getTimestamp(); 
    printjson(doc); 
    }); 

は、次のような結果に

{ 
     "_id" : { 
       "month" : ObjectId("57bd7d3c0da65e3f92328e50"), 
       "day" : ObjectId("57bd7d3c0da65e3f92328e51"), 
       "year" : ObjectId("57bd7d3c0da65e3f92328e52") 
     }, 
     "averageQuantity" : 200, 
     "count" : 1, 
     "doc._id.month" : ISODate("2016-08-24T10:55:56Z"), 
     "doc._id.day" : ISODate("2016-08-24T10:55:56Z"), 
     "doc._id.year" : ISODate("2016-08-24T10:55:56Z") 
} 
関連する問題