这真是一个悬而未决的问题。我很抱歉,如果这有点模糊,但我正试图收集其他人的想法,因为我是Mongo的新手
may be same
或might got changed
在后续文件转储期间(我们希望稍后进行更改)ObjectId
(here),这使文档变得独一无二li>
Map Reduce
将其删除?答案 0 :(得分:2)
今晚我很无聊,所以我们走了。
> db.users.insert({name: 'John', other_field: Math.random()})
> db.users.insert({name: 'Bob', other_field: Math.random()})
> db.users.insert({name: 'Mary', other_field: Math.random()})
> db.users.insert({name: 'John', other_field: Math.random()})
> db.users.insert({name: 'Jeff', other_field: Math.random()})
> db.users.insert({name: 'Ivan', other_field: Math.random()})
> db.users.insert({name: 'Mary', other_field: Math.random()})
> db.users.find()
{
"_id" : ObjectId("501976e9bee9b253265bba8b"),
"name" : "John",
"other_field" : 0.9884713875252772
}
{
"_id" : ObjectId("501976e9bee9b253265bba8c"),
"name" : "Bob",
"other_field" : 0.048004131996396415
}
{
"_id" : ObjectId("501976e9bee9b253265bba8d"),
"name" : "Mary",
"other_field" : 0.20415803582615222
}
{
"_id" : ObjectId("501976e9bee9b253265bba8e"),
"name" : "John",
"other_field" : 0.5514446987265585
}
{
"_id" : ObjectId("501976e9bee9b253265bba8f"),
"name" : "Jeff",
"other_field" : 0.8685077449753242
}
{
"_id" : ObjectId("501976e9bee9b253265bba90"),
"name" : "Ivan",
"other_field" : 0.2842514340422925
}
{
"_id" : ObjectId("501976eabee9b253265bba91"),
"name" : "Mary",
"other_field" : 0.984048520281136
}
var map = function() {
emit(this.name, this);
};
var reduce = function(name, vals) {
var last_obj = null;
vals.forEach(function(v) {
if(!last_obj || v._id > last_obj._id) {
last_obj = v;
}
});
return last_obj;
};
db.users.mapReduce(map, reduce, {out: 'temp_coll'})
它基本上按名称对所有文档进行分组,然后选择具有最大_id
的文档。
> db.temp_coll.find()
{
"_id" : "Bob",
"value" : {
"_id" : ObjectId("501976e9bee9b253265bba8c"),
"name" : "Bob",
"other_field" : 0.048004131996396415
}
}
{
"_id" : "Ivan",
"value" : {
"_id" : ObjectId("501976e9bee9b253265bba90"),
"name" : "Ivan",
"other_field" : 0.2842514340422925
}
}
{
"_id" : "Jeff",
"value" : {
"_id" : ObjectId("501976e9bee9b253265bba8f"),
"name" : "Jeff",
"other_field" : 0.8685077449753242
}
}
{
"_id" : "John",
"value" : {
"_id" : ObjectId("501976e9bee9b253265bba8e"),
"name" : "John",
"other_field" : 0.5514446987265585
}
}
{
"_id" : "Mary",
"value" : {
"_id" : ObjectId("501976eabee9b253265bba91"),
"name" : "Mary",
"other_field" : 0.984048520281136
}
}
例如,删除原始集合,迭代此集合并将值插入新集合中。完成后别忘了放弃临时收藏。
我没有费心从objectid中提取时间戳,因为我假设你的导入作业不是每秒两次(甚至不是每秒一次)。
答案 1 :(得分:0)
好了,因为对象id使用时间戳作为前导四个字节,你可以通过一些数学运算来实现。
值得庆幸的是,mongo shell有一种从对象id获取时间戳的方法,你需要做更多的javascript来首先查询你的文件同名,然后将它们存储在临时变量中(如果使用命令行)或者在临时表中(如果使用驱动程序)并使用下面链接中显示的时间戳获取器解析每个id。
请记住,对象ID仅精确到秒,因此在快速插入模式下仍无效。
但无论哪种方式,您要求的都是可以在map reduce函数中执行,或者以上面显示的方式通过命令行执行。
试一试,如果你遇到困难,请告诉我。如果我知道你的收藏结构,我可以快速鞭打一些东西,但只有在你猛击它几次之后:)