美文网首页
mongoDB 数据重复问题

mongoDB 数据重复问题

作者: Joncc | 来源:发表于2021-01-06 16:26 被阅读0次

MongoDB 索引

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
  1. createIndex() 方法
    MongoDB使用 createIndex() 方法来创建索引。

注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。

  1. 语法
    createIndex()方法基本语法格式如下所示:
>db.collection.createIndex(keys, options)
  • keys:
    语法中 keys值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可

  • options:
    createIndex() 接收可选参数,可选参数列表如下:

image.png

设置唯一值索引字段,解决插入数据重复

  • 如果字段是唯一的,那就不会出现重复插入的情况了。db.collection.createIndex(keys, options) options设置为{unique:true}

  • 为指定字段创建唯一值索引
    在MongoDB中_id字段默认时唯一值索引字段,它永远不会重复,我其实们也可以添加其他字段为唯一值索引字段,创建代码如下:

# 单个字段唯一索引 这里的name:1的意思是升序,name:-1 是降序
db.collection.createIndex({name:1},{unique:true}) 
如需要多个字段联合唯一索引,可参照如下方式:

# 多个字段联合索引示例
db.collection.createIndex({ip:1,server_port:1},{unique:true})
  • 在设置好唯一索引字段后,代码逻辑修改如下:
try:
    db.collection.insert_one(dict_example)
except DuplicateKeyError:
    # 重置更新abbs字段
    db.collection.update_one({"name":name_example}, {"$set": {"abbs":abbs_example}})
    # 增量不重复的方式更新source字段
    db.collection.update_one({"name":name_example}, {"$addToSet":{"abbs":{"$each":abbs_example}}})
  • 这里直接去掉了每次更新数据前的查询操作,改为先直接进行insert操作,如果当前索引字段name不存在,则会插入成功,若已经存在,则会捕捉异常并执行更新操作。即使在并发情况下,由于唯一索引机制,也不会出现同时插入相同文档的结果,并发下插入失败的的操作将会重新进行后续的更新操作。

这样既提高了MongoDB的写入的效率也解决了并发下重复数据的问题

use manegers
db.manegers.drop()
db.createCollection("manegers")
db.manegers.createIndex({"ip":1,"server_port":1},{unique:true})
db.manegers.getIndexes()

[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "manegers.manegers"
        },
        {
                "v" : 2,
                "unique" : true,
                "key" : {
                        "ip" : 1,
                        "server_port" : 1
                },
                "name" : "ip_1_server_port_1",
                "ns" : "manegers.manegers"
        }
]

参考:越大大雨天
链接:https://www.jianshu.com/p/adedee065c28
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

网友评论

      本文标题:mongoDB 数据重复问题

      本文链接:https://www.haomeiwen.com/subject/qtknoktx.html