我在 MongoDB 数据库中有大量带有时间戳的文档。每个文档都有一个唯一的标识符。
使用下面的示例文档,我首先想按“updateDate”对集合进行排序,然后为每个包含唯一“domainName”的文档检索“uniqueIdentifier”列表。
{
"domainName": "www.example-domain-0.com",
"updateDate": {
"$date": "2013-09-10T19:20:56.652Z"
},
"uniqueIdentifier": "375d7219-828c-4f81-a1fc-3692aa68d110"
}
{
"domainName": "www.example-domain-1.com",
"updateDate": {
"$date": "2013-09-12T19:44:56.833Z"
},
"uniqueIdentifier": "f96bb647-5dcb-4cc1-8a66-105177a45474"
}
{
"domainName": "www.example-domain-0.com",
"updateDate": {
"$date": "2013-09-12T19:10:56.833Z"
},
"uniqueIdentifier": "14f6yu43-20eb-42c6-bb06-26b77c0bf0cb"
}
{
"domainName": "www.example-domain-2.com",
"updateDate": {
"$date": "2013-09-12T19:39:56.833Z"
},
"uniqueIdentifier": "b2a6ae10-20eb-42c6-bb06-26b77c0bf0cb"
}
对于上面的集合,我想得到以下有序的结果集:
"f96bb647-5dcb-4cc1-8a66-105177a45474",
"b2a6ae10-20eb-42c6-bb06-26b77c0bf0cb",
"14f6yu43-20eb-42c6-bb06-26b77c0bf0cb"
请注意,没有返回“375d7219-828c-4f81-a1fc-3692aa68d110”,因为有 2 个文档包含:
"domainName": "www.example-domain-0.com".
在 Java 中完成此任务的最快方法是什么?如果它是一个 map-reduce 函数,谁能帮我理解如何用 Java 编写它?
目前我在 Java 中使用以下内容,但是对于大型集合来说效率非常低:
Map<String, String> domainMap = new HashMap<String, String>();
BasicDBObject restrict = new BasicDBObject("uniqueIdentifier", 1)
.append("domainName", 1);
DBCursor cur = domainCollection.find(null, restrict).sort(
new BasicDBObject("updateDate", -1));
while (cur.hasNext()) {
String id = cur.next().get("uniqueIdentifier").toString();
String domain = cur.next().get("uniqueIdentifier").toString();
if (!domainMap.containsKey(domain)) {
domainMap.put(domain, id);
}
}
cur.close();