为了账号安全,请及时绑定邮箱和手机立即绑定

即使添加了唯一密钥,MongoDB也会复制文档

即使添加了唯一密钥,MongoDB也会复制文档

手掌心 2019-11-19 14:42:18
我创建了一个集合并添加了一个像这样的唯一键db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})该集合看起来像这样的“ user_services”{ "_id" : ObjectId("55068b35f791c7f81000002d"), "uid" : 15, "sid" : 1, "rate" : 5},{ "_id" : ObjectId("55068b35f791c7f81000002f"), "uid" : 15, "sid" : 1, "rate" : 4}问题:我正在使用php驱动程序插入具有相同uid和sid的文档,并且该文档正在被插入。我想要的是在Mongo Shell上:在uid和sid上添加唯一键,没有重复的文件使用相同的uid和sid。在PHP方面:具有类似mysql “在重复键更新速率= rate + 1上插入(值)”之类的内容。就是说,每当我尝试插入文档时,如果没有插入,都应插入它,否则它将更新文档的费率字段
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

我觉得对于这种基本的MongoDB操作,当前最流行的答案有点过于本地化和过于详细-通过键从mongo中删除重复项。


通过mongo> 3.0的键删除重复项很简单。只需运行此查询,替换yourDuplicateKey并假设_id您是主键(请确保您mongodump以防万一):


db.yourCollection.aggregate([

    { "$group": {

        "_id": { "yourDuplicateKey": "$yourDuplicateKey" },

        "dups": { "$push": "$_id" },

        "count": { "$sum": 1 }

    }},

    { "$match": { "count": { "$gt": 1 } }}

]).forEach(function(doc) {

    doc.dups.shift();

    db.yourCollection.remove({ "_id": {"$in": doc.dups }});

});


查看完整回答
反对 回复 2019-11-19
  • 2 回答
  • 0 关注
  • 582 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信