2017-02-19 40 views
0

鉴于这种源数据: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)记录,并打印出完整的行为每个产品的记录按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字段(日期,productID),但会有许多其他字段是运行时未定义 - 我怎样才能返回对象中的所有字段而不指定它们。 – sub123