2017-02-19 17 views
0

内の最新の項目は、このソースデータが与えられ得るために:私は(productIDをキー)各製品の最新のレコードを取得し、そのための完全な行をプリントアウトしたいMongoDBの集計 - クエリーグループ

{ "_id" : ObjectId("1"), "productID" : 1, "amount" : 1, "date" : ISODate("2017-02-01T00:00:00Z") } 
{ "_id" : ObjectId("2"), "productID" : 2, "amount" : 2, "date" : ISODate("2017-02-01T00:00:00Z") } 
{ "_id" : ObjectId("3"), "productID" : 3, "amount" : 3, "date" : ISODate("2017-02-01T00:00:00Z") } 
{ "_id" : ObjectId("4"), "productID" : 4, "amount" : 4, "date" : ISODate("2017-02-01T00:00:00Z") } 
{ "_id" : ObjectId("5"), "productID" : 1, "amount" : 11, "date" : ISODate("2017-02-02T00:00:00Z") } 
{ "_id" : ObjectId("6"), "productID" : 2, "amount" : 22, "date" : ISODate("2017-02-02T00:00:00Z") } 
{ "_id" : ObjectId("7"), "productID" : 2, "amount" : 222, "date" : ISODate("2017-02-03T00:00:00Z") } 
{ "_id" : ObjectId("8"), "productID" : 3, "amount" : 33, "date" : ISODate("2017-02-03T00:00:00Z") } 

を製品ごとのレコードはproductIDでソートされています。だから、上から私の所望の出力は次のようになります。私はモンゴとなる問題に新たなんだ

{ "_id" : ObjectId("5"), "productID" : 1, "amount" : 11, "date" : ISODate("2017-02-02T00:00:00Z") } 
{ "_id" : ObjectId("7"), "productID" : 2, "amount" : 222, "date" : ISODate("2017-02-03T00:00:00Z") } 
{ "_id" : ObjectId("8"), "productID" : 3, "amount" : 33, "date" : ISODate("2017-02-03T00:00:00Z") } 
{ "_id" : ObjectId("4"), "productID" : 4, "amount" : 4, "date" : ISODate("2017-02-01T00:00:00Z") } 

、それを最大限に得ることができたが、それぞれの製品のために他の古いレコードを削除することができませんでした。

答えて

0

$last$firstの演算子を使用できます。あなたがグループ化する前に文書を並べ替える必要があることに注意してください:

db.so.aggregate([ 
{ $sort: {productID:-1, date: -1} }, 
{ 
    $group: { 
     _id : "$productID", 
     date: {$last: "$date" }, 
     amount: {$first: "$amount" }, 
     id : {$first: "$_id"} 
    } 
}, 
{ $project: { _id: "$id", productId: "$_id", date: 1, amount: 1 } } 
]) 

出力:大きな助けだ

{ 
    "_id" : 5, 
    "productId" : 1, 
    "date" : ISODate("2017-02-01T00:00:00.000Z"), 
    "amount" : 11 
}, 
{ 
    "_id" : 7, 
    "productId" : 2, 
    "date" : ISODate("2017-02-01T00:00:00.000Z"), 
    "amount" : 222 
}, 
{ 
    "_id" : 8, 
    "productId" : 3, 
    "date" : ISODate("2017-02-01T00:00:00.000Z"), 
    "amount" : 33 
}, 
{ 
    "_id" : 4, 
    "productId" : 4, 
    "date" : ISODate("2017-02-01T00:00:00.000Z"), 
    "amount" : 4 
} 
+0

感謝。しかし、私は事前に完全な文書スキーマ(つまりこれは一般的です)を認識していないので、固定日付フィールドとidフィールド(date、productID)を持つことになりますが、他の多くのフィールドがあります実行時に定義されていないオブジェクトからすべてのフィールドを返す方法 – sub123