我怎样才能 return 一组不同的日期排序文件?
How can I return a distinct array of date ordered documents?
在 mongodb 中,我有一个 locations
集合,其中包含有关一个人去过的地方的数据。
我有一个 operatorID
字段、一个 location
对象和一个 updatedAt
ISODate 字段。
例如
{"_id" : ObjectId("..."), "location" : [object Object], "operatorID" : "T800", "updatedAt" : ISODate("2015-01-08T10:54:32.389Z") }
{"_id" : ObjectId("..."), "location" : [object Object], "operatorID" : "T800", "updatedAt" : ISODate("2015-01-08T11:00:15.304Z") }
{"_id" : ObjectId("..."), "location" : [object Object], "operatorID" : "T1000", "updatedAt" : ISODate("2015-01-09T14:50:32.129Z") }
{"_id" : ObjectId("..."), "location" : [object Object], "operatorID" : "T1000", "updatedAt" : ISODate("2015-01-10T13:10:15.204Z") }
{"_id" : ObjectId("..."), "location" : [object Object], "operatorID" : "T100", "updatedAt" : ISODate("2015-01-25T14:50:32.129Z") }
{"_id" : ObjectId("..."), "location" : [object Object], "operatorID" : "T100", "updatedAt" : ISODate("2015-01-24T13:10:15.204Z") }
给定一个名称数组,我如何 return 一个按 updatedAt:1
排序的最新唯一操作员 ID 的数组?
例如:给定 { operatorID: { $in: ["T1000", T800"] } }
{"_id" : ObjectId("222"), "location" : [object Object], "operatorID" : "T800", "updatedAt" : ISODate("2015-01-08T11:00:15.304Z") }
{"_id" : ObjectId("333"), "location" : [object Object], "operatorID" : "T1000", "updatedAt" : ISODate("2015-01-09T14:50:32.129Z") }
我一直在 shell 中尝试这个,这让我大部分时间都在那里,但我基本上只需要 return 每组 operatorID 中的最后一个对象:
db.locations.find( { $query: {'operatorID': { $in: ["T1000", "T800"] } }, $orderby: { operatorID:1, updatedAt:1 } } )
和
db.locations.find( { operatorID: { $in: ["T1000", "T800"] } } ).sort( { operatorID:1, updatedAt:1 } )
其中 return 所有 T1000 和 T800 在各自的组中按名称和日期排序。
谢谢!
在一个小的副集合中跟踪此信息可能是个好主意,但对于您当前的集合,您可以使用聚合:
db.locations.aggregate([
{ "$sort" : { "updatedAt" : -1 } },
{ "$group" : { "_id" : "$operatorID", "updatedAt" : { "$first" : "$updatedAt" } } }
])
在 mongodb 中,我有一个 locations
集合,其中包含有关一个人去过的地方的数据。
我有一个 operatorID
字段、一个 location
对象和一个 updatedAt
ISODate 字段。
例如
{"_id" : ObjectId("..."), "location" : [object Object], "operatorID" : "T800", "updatedAt" : ISODate("2015-01-08T10:54:32.389Z") }
{"_id" : ObjectId("..."), "location" : [object Object], "operatorID" : "T800", "updatedAt" : ISODate("2015-01-08T11:00:15.304Z") }
{"_id" : ObjectId("..."), "location" : [object Object], "operatorID" : "T1000", "updatedAt" : ISODate("2015-01-09T14:50:32.129Z") }
{"_id" : ObjectId("..."), "location" : [object Object], "operatorID" : "T1000", "updatedAt" : ISODate("2015-01-10T13:10:15.204Z") }
{"_id" : ObjectId("..."), "location" : [object Object], "operatorID" : "T100", "updatedAt" : ISODate("2015-01-25T14:50:32.129Z") }
{"_id" : ObjectId("..."), "location" : [object Object], "operatorID" : "T100", "updatedAt" : ISODate("2015-01-24T13:10:15.204Z") }
给定一个名称数组,我如何 return 一个按 updatedAt:1
排序的最新唯一操作员 ID 的数组?
例如:给定 { operatorID: { $in: ["T1000", T800"] } }
{"_id" : ObjectId("222"), "location" : [object Object], "operatorID" : "T800", "updatedAt" : ISODate("2015-01-08T11:00:15.304Z") }
{"_id" : ObjectId("333"), "location" : [object Object], "operatorID" : "T1000", "updatedAt" : ISODate("2015-01-09T14:50:32.129Z") }
我一直在 shell 中尝试这个,这让我大部分时间都在那里,但我基本上只需要 return 每组 operatorID 中的最后一个对象:
db.locations.find( { $query: {'operatorID': { $in: ["T1000", "T800"] } }, $orderby: { operatorID:1, updatedAt:1 } } )
和
db.locations.find( { operatorID: { $in: ["T1000", "T800"] } } ).sort( { operatorID:1, updatedAt:1 } )
其中 return 所有 T1000 和 T800 在各自的组中按名称和日期排序。
谢谢!
在一个小的副集合中跟踪此信息可能是个好主意,但对于您当前的集合,您可以使用聚合:
db.locations.aggregate([
{ "$sort" : { "updatedAt" : -1 } },
{ "$group" : { "_id" : "$operatorID", "updatedAt" : { "$first" : "$updatedAt" } } }
])