范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python和MongoDB其实很配

  MongoDB 其实就是一个大大的  JSON ,在 Python 的世界里 dict  也是最吃香的类型,所以,他们天生就是一对。MongoDB 的安装
  推荐使用 Docker 来部署管理,一行命令就可以搞定,官方版本: docker run -d --name mongodb      -e MONGO_INITDB_ROOT_USERNAME=admin      -e MONGO_INITDB_ROOT_PASSWORD=admin      -v ~/data/mongo_dir:/data/db      -p 27017:27017      mongo
  官方版本的 Docker 啥都好,就是体积有点大。还有一个小体积的  alpine  版本,开发时使用很方便,不过不能配置账户和密码。docker run -d --name mongo-lite    -p 27018:27017    -v ~/data/mongo_lite:/data/db    mvertes/alpine-mongo
  如果想尝试 Mongo 的命令行 (Mongo Shell),直接进到 Docker 里: $ docker exec -it mongo-lite mongo MongoDB shell version v4.0.6 connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb ...  > use mydb switched to db mydb  > db.User.insertOne({"name":"Toby",age:18}) {  "acknowledged" : true,  "insertedId" : ObjectId("612c84c5d93795436ad27ebc") }  > db.User.find() { "_id" : ObjectId("612c84c5d93795436ad27ebc"), "name" : "Toby", "age" : 18 }
  Mongo Shell 官方文档:https://docs.mongodb.com/manual/reference/mongo-shell/ PyMongo 五分钟上手
  安装 PyMongo 可以通过  pip  搞定。pip install pymongo
  以下内容也可以参考官方文档:https://pymongo.readthedocs.io/en/stable/ 连接数据库
  常见方式如下: from pymongo import MongoClient  # 连接有密码的Mongo client = MongoClient("mongodb://admin:admin@localhost:27017/")  # 连接没密码的Mongo client = MongoClient("mongodb://localhost:27018/")  # 列出所有已经存在的DB for db in client.list_databases():     print(db)  # 使用Mongo里的某个DB,这个DB可以不存在,后面写数据时会被创建出来 db = client.mydb 插入数据
  插入的每条数据都是一个  dict ,一样的字段允许类型不一样,也允许每次插入的数据字段不一样,可以理解成动态类型数据,你想放什么都行,唯一的约束就是他们会被放在同一个 Document  里。# 插入一条数据 def add_one_user():     db.User.insert_one({         "name": "Toby",         "age": 18     })  # 插入多条数据 def add_many_users():     db.User.insert_many([{         "name": "Tom",         "age": 10     }, {         "name": "Toby",         "age": "unknown",         "hobbies": ["write bugs", "raise dogs"]     }])
  这里的  User  约等于关系型数据库的表,但它的名字叫 Document ,每次数据插入完成后会返回一个_id ,这是 Mongo 里最重要的东西了,它就是靠这个_id  来保证数据的一致性,后续的数据修改和删除主要就是靠这个_id  来完成,所以一般针对某条特定的数据的处理,都是需要先查询它的_id ,然后再进行后面的操作。查询数据# 查询多个数据 def show_users():     # 一个表里所有数据     for e in db.User.find():         print(e)      # 匹配条件的多条数据     for e in db.User.find({"name": "Toby"}):         print(e)   # 查询单个数据 def query_user(name):     return db.User.find_one({"name": name})   # 忽略大小写 def query_user_ignore_case(name):     return db.User.find_one({"name": re.compile(name, re.IGNORECASE)})   # 使用运算符 https://docs.mongodb.com/manual/reference/operator/query/ def query_teenager():     return db.User.find_one({"age": {"$lt": 18}})
  Mongo 的查询主要还是依赖 DB 自己提供的运算符,在 PyMongo 里要注意,这里不会抛出异常,如果找不到数据,默认返回 None。 通过运算符查询数据:https://docs.mongodb.com/manual/reference/operator/query/ 通过聚合查询数据:https://docs.mongodb.com/manual/aggregation/ 修改数据# 修改一个数据 def update_user(user, attributes: dict):     user.update(attributes)     result = db.User.replace_one({"_id": user["_id"]}, user, upsert=True)     return {"affected_count": result.modified_count}  u = query_user_ignore_case("toby") result = update_user(u, {"code": "python"})  # 修改多个数据,注意有坑,Replace 和 Update是不一样的 def update_many():     todo = [         UpdateOne({"age": 19}, {"$set": {"name": "Toby"}}),         ReplaceOne({"name": "Tom"}, {"age": 19}),  # name 会被吃掉     ]     result = db.User.bulk_write(todo)     print(result.matched_count)
  Replace  是替换,所以要带上原有字段,这里有点坑。Update  不接受单独的 dict ,需要用 $set  / $unset  来标识修改的字段的方式。   [       { $set: { status: "Modified", comments: [ "$misc1", "$misc2" ] } },       { $unset: [ "misc1", "misc2" ] }    ] 删除数据def delete_user(name):     result = db.User.delete_one({"name": name})     return {"affected_count": result.deleted_count}
  删除多个数据: >>> db.test.count_documents({"x": 1}) 3 >>> result = db.test.delete_many({"x": 1}) >>> result.deleted_count 3 >>> db.test.count_documents({"x": 1}) 0 常见问题有什么办法可以让 Mongo 不自动添加_id到我的数据里?
  几乎没有,这是 MongoDB 的特性决定的,如果你的数据没有 ID 的话,并且进行高并发插入时,大概率会遇到  BulkWriteError  这个错误。>>> doc = {} >>> collection.insert_many(doc for _ in range(10)) Traceback (most recent call last): ... pymongo.errors.BulkWriteError: batch op errors occurred >>> doc {"_id": ObjectId("560f171cfba52279f0b0da0c")}  >>> docs = [{}] >>> collection.insert_many(docs * 10) Traceback (most recent call last): ... pymongo.errors.BulkWriteError: batch op errors occurred >>> docs [{"_id": ObjectId("560f1933fba52279f0b0da0e")}]
  如果你不想要自动生成的  ID ,可以自己在插入数据前指定这个字段。为啥我指定了_id还是查询不到我的数据?
  比如我要查询数据库里的某个 post: >>> post_id_as_str = str(post_id) >>> posts.find_one({"_id": post_id_as_str}) # No result
  因为 pyMongo 里的这个 ID 不是字符串类型,你需要做一下数据转换。 from bson.objectid import ObjectId  # The web framework gets post_id from the URL and passes it as a string def get(post_id):     # Convert from string to ObjectId:     document = client.db.collection.find_one({"_id": ObjectId(post_id)}) 用标准库里的 json 模块来序列化和反序列化 Mongo 的数据会有什么问题?
  有一些数据类型在反序列后会得不到预期的结果,比如  ObjectId  和 DBRef ,PyMongo 为了解决这个问题自己封装了一个辅助类 json_util ,可以很好的解决这些问题。from bson.json_util import loads from bson.json_util import dumps 总结
  Mongo 属于非关系型数据库,使用 Mongo 作为 DB 的思维需要做比较大的转变: 关系型数据库一般读写容易,修改难,容易理解 非关系型数据库一般是读写改容易,设计难(相对而言) "
  关系型数据库支持 ACID (Atomicity, Consistency, Isolation, Duration) 即原子性,一致性,隔离性和持续性。相对而言,NoSQL 采用更宽松的模型 BASE (Basically Available, Soft state, Eventual Consistency) 即基本可用,软状态和最终一致性。
  NoSQL 在精心的设计下查询性能会更高,数据结构也十分有弹性,特别适合快速发展和属性不确定的产品功能,但 Mongo 不支持事务,如何确保数据一致性是个挺大的挑战。
  在选择上可以考虑从以下角度去思考: 需要 ACID 还是 BASE 需要结构化数据还是非结构化数据 需要对数据进行灵活扩展 开发人员的经验
  很多情况只考虑最后一点就可以了。

比亚迪搭载DMi混动系统的车型2003年开始研发,2008年正式上市的混合动力车型比亚迪F3DM,是中国品牌首款量产插电式混合动力汽车。这款具有里程碑式意义的车型奠定了比亚迪在中国新能源汽车市场中的开拓者和引领比亚迪的DMi系统是以电动机驱动为主,发动机起辅助作用。2003年开始研发,2008年正式上市的混合动力车型比亚迪F3DM,是中国品牌首款量产插电式混合动力汽车。这款具有里程碑式意义的车型奠定了比亚迪在中国新能源汽车市场中的开拓者和引领宋Max家用轿车首选2020年8月1日晚,比亚迪宋MAX(参数询价)升级版正式上市,新车共推出4款车型,售价区间为9。4812。48万元。新车相比现款在外观和内饰方面均有升级,动力方面继续搭载1。5T比亚迪4S店二代宋Pro进店享优惠本周宋Pro最新报价比亚迪益丰祥泰店10。22日限时促销,降价10。78,如此优惠的降幅,大家可千万不要错过,店铺地址内蒙古自治区呼伦贝尔市鄂温克族自治旗巴彦托海镇南工业园区利丰汽比亚迪宋MAX进店享优惠本周宋MAX最新报价比亚迪益丰祥泰店10。25限时促销,直降0。4万元,如此优惠的降幅,大家可千万不要错过,店铺地址内蒙古自治区呼伦贝尔市鄂温克族自治旗巴彦托海镇南工业园区利丰汽车比亚迪人车互联比亚迪汽车App全新升级上线,整体视觉风格耳目一新。同时,其在原有基础上融合了原迪粉汇小程序的功能,并增加了诸多新功能。通过官方展示图我们能够看到,比亚迪汽车App视觉设计采用了淡呼伦贝尔宋MAX降价0。4万元,欢迎莅临赏鉴本周宋MAX最新报价比亚迪益丰祥泰店10。2210。22限时促销,降价4。22,如此优惠的降幅,大家可千万不要错过,店铺地址内蒙古自治区呼伦贝尔市鄂温克族自治旗巴彦托海镇南工业园区比亚迪已累计向挪威发运超1000台唐EV。日前,我们从比亚迪官方了解到,将有450台比亚迪唐(参数询价)EV车型在广州港集结,启程前往挪威。至此,比亚迪已累计向挪威发运超1000台唐EV。今年5月,比亚迪对外宣布,将挪威作呼伦贝尔南屯汽车城比亚迪4S店享优惠本周宋MAX最新报价比亚迪益丰祥泰店10。24限时促销,直降0。4万元,如此优惠的降幅,大家可千万不要错过,店铺地址内蒙古自治区呼伦贝尔市鄂温克族自治旗巴彦托海镇南工业园区利丰汽车二胎时代的家庭型用车,比亚迪宋MAX2020年8月1日晚,比亚迪宋MAX(参数询价)升级版正式上市,新车共推出4款车型,售价区间为9。4812。48万元。新车相比现款在外观和内饰方面均有升级,动力方面继续搭载1。5T比亚迪新能源唐EV累计向挪威发运超1000台日前,我们从比亚迪官方了解到,将有450台比亚迪唐(参数询价)EV车型在广州港集结,启程前往挪威。至此,比亚迪已累计向挪威发运超1000台唐EV。今年5月,比亚迪对外宣布,将挪威作
AppStore限免电影精灵Mudra项目管理等,共5款在今天限免的iOS限免应用中,波老师精选了以下4款限免应用,1款限免游戏。复制logo上方名字即可前往AppStore下载。如遇恢复原价,则表示限免已结束,请谨慎下载。具体下载方式或许只需3299元?最便宜的5G版iPhone来了为什么iPhoneSE被称为小钢炮?因为小巧高性能一直是它的代名词。当时A9芯片2GB运存真的可以说是一大杀器,iPhone6s的同款配置也让它一样获得了iOS15最新系统升级的门AppStore限免花儿锁屏短信狗Memorize等,共5款在今天限免的iOS限免应用中,波老师精选了以下4款限免应用,1款限免游戏。复制logo上方名字即可前往AppStore下载。如遇恢复原价,则表示限免已结束,请谨慎下载。具体下载方式6月17日AppStore限免Imagez成功日记本荒原遗迹等,共5款在今天限免的iOS限免应用中,波老师精选了以下4款限免应用,1款限免游戏。复制logo上方名字即可前往AppStore下载。如遇恢复原价,则表示限免已结束,请谨慎下载。具体下载方式中国移动称鸿蒙系统是盗版安卓?官方回应打脸了自6月2号,华为正式推出鸿蒙2。0系统以来,鸿蒙系统是盗版安卓的声音一直都没有间断过。随着更换鸿蒙系统的用户增多,虽然说鸿蒙系统是盗版安卓这话的人少了很多。但是,近日一个鸿蒙系统是AppStore限免方便面艾琳相机Random等,共5款在今天限免的iOS限免应用中,波老师精选了以下3款限免应用,2款限免游戏。复制logo上方名字即可前往AppStore下载。如遇恢复原价,则表示限免已结束,请谨慎下载。具体下载方式AppStore限免剩余电量扫描口袋宝ProEarCat等,共5款在今天限免的iOS限免应用中,波老师精选了以下2款限免应用,3款限免游戏。复制logo上方名字即可前往AppStore下载。如遇恢复原价,则表示限免已结束,请谨慎下载。具体下载方式AppStore限免加密相册目录笔记TechNeck等,共5款在今天限免的iOS应用中,波老师精选了以下5款限免应用。复制logo上方名字即可前往AppStore下载。如遇恢复原价,则表示限免已结束,请谨慎下载。具体下载方式复制logo上方名AppStore限免TODOT气压计磨牙症治疗等,共5款在今天限免的iOS限免应用中,波老师精选了以下5款限免应用。复制logo上方名字即可前往AppStore下载。如遇恢复原价,则表示限免已结束,请谨慎下载。具体下载方式复制logo上AppStore限免App分类管理器photoML动画绘制等,共5款在今天限免的iOS限免应用中,波老师精选了以下5款限免应用。复制logo上方名字即可前往AppStore下载。如遇恢复原价,则表示限免已结束,请谨慎下载。具体下载方式复制logo上AppStore限免FeilinLUTs易剪等,共5款在今天限免的iOS限免应用中,波老师精选了以下4款限免应用,1款限免游戏。复制logo上方名字即可前往AppStore下载。如遇恢复原价,则表示限免已结束,请谨慎下载。具体下载方式