MongoDB建立index,可以设置为unique.若在之前有重复的键值,那么我们必须要去除掉重复的.
若我们使用的是原生的mongo且版本小于3.0,则unique为true外,外加参数dropDups为true即可.但除此之外,在mongo3.0+,tokumx,我们只能手工搞定.
一段如下的脚本可以帮助mongo去除带重复键的doc. 在第一行改为想要去重并加unique的collection name,第二行改为一个不存在,临时的collection name,以便存储过程数据.等脚本结束后第二行的collection会被删掉. 第5,13行需要指定field name. 比如我想要让sid这个字段值为唯一.
var coll="coll_to_remove"
var tmp_coll = "sid_dups"
db.getCollection(coll).mapReduce(
function() { emit(this.sid,1); },
function(k,vals) { return Array.sum(vals); },
{out:tmp_coll}
)
db.getCollection(tmp_coll).find({"value":{$gt:1}}).forEach(
function(obj) {
var cur = db.getCollection(coll).find(
{sid:obj._id},
{_id:1}
);
var skip = true;
while(cur.hasNext()) {
var doc = cur.next();
if (skip) {
skip = false;
continue
}
db.getCollection(coll).remove(
{_id: doc._id});
}
}
)
db.getCollection(coll).ensureIndex({"sid":1},{unique:true})
db.getCollection(tmp_coll).drop()
Ref:
- http://stackoverflow.com/questions/13190370/how-to-remove-duplicates-based-on-a-key-in-mongodb
- http://glassonionblog.wordpress.com/2012/03/19/mongodb-how-to-check-for-duplicates-in-a-collection/
- http://stackoverflow.com/questions/8405331/how-to-remove-duplicate-record-in-mongodb-by-mapreduce