本人最近使用新接触python的pymongo模块连接mongoldb来进行数据操作。第一次接触,可以说是屡屡碰壁,现对于一些问题进行总结。
本文仅介绍本人遇到的那些不易百度或google到的问题,并附上一些小技巧。供初学者参考。也欢迎各位老司机们批评指正~~鼓掌~~~
言归正传。
1. 连接数据库
先引入pymongo模块和MongoClient,连接mongo还有一种方法是连connection,但可能版本问题,本人引入后报错不存在,这里暂且不论。
import pymongo
from pymongo import MongoClient
然后就是老套路了哈哈哈,此处xxx为你mongodb的地址,可以是本地,也可以是远程。yyy是你的数据库名字。sss就是你连接的collection的名字啦~
client = MongoClient("xxx")
db = client.yyy
col = db.session
当然,为了容错性更好,你也可以这么写:(我这里是把报错打成json包返回)
client = MongoClient("xxx")
error = {}
if not client:
error["errorMsg"]="failed" return json.dumps(error)
else:
db = client.yyy
col = db.sss
这里需要了解一点,就是col是你所连的聚集,你可能聚集里面还有很多的记录,这些记录都有个唯一的ObjectId类型的_id。你可以通过_id来指定你要访问的某个记录集
2. 插入多级字段数据
"_id" : ObjectId("58121b864c26bf241b000056"),
"student" : {
"grades" : {
"math" : 90,
"English" : 80,
"Chinese" : 70,
}
}
}
比如我想把这段数据录进数据库里面,如果这段东西都是你录,那很好办。你直接以json格式把数据录进去就好。然而当你遇见,一个人先创建好了这条记录集,它已经具有了系统自动附加的_id,而且甚至这个人已经写了"teacher":"MrWang"的这条字段,需要你添加student标签下的字段,这咋办?insert在这里是不适用的,因为它是插入(或者说创建更好)一个新的记录集,并且系统也会给定一个唯一的_id。
于是这里需要用到update了!这也是pymongo很神奇的地方。它可以update来更改记录,如果update的记录没有找到相应key值,它会自动创建相应字段~~然而这里还是遇见了一个问题:student标签下又分成grades,再分成math,English等。这里其实解决办法也很容易,利用符号"."来分级。
综上,代码如下:
col.update({"_id":ObjectId("58121b864c26bf241b000056")},{"$set":{"student.grades.math":90}})
col.update({"_id":ObjectId("58121b864c26bf241b000056")},{"$set":{"student.grades.English":80}})
依此类推即可。
如果你的客户需求很谨慎,想要提高容错性,他希望student标签下的内容一定要由你建立,如果你在插入student字段前,发现已经有了student标签,你需要报错。这样的需求不只需要update,因为update的功能是:如果有相应字段,它就把相应字段update,如果没有相应字段,它就创建相应字段并update。其实这个很容易解决:
error={}
v=col.find_one({"_id":ObjectId(str(strObjId))})
if v.has_key('student'): error["errorMsg"]="failed" return json.dumps(error) else:
col.update({"_id":ObjectId(str(strObjId))},{"$set":{"student.grades.math":90}})
就是先利用find_one返回dict格式数据,再用python的dict中的has_key判断是否有student这个标签就好啦~~~
先写这么多,以后遇见新的问题再写。希望对初学者有帮助。因为本人也是初次接触python,感觉python确实强大,大家有空也可以学学。知乎上一句话咋说的来着:程序员世界里第一重要是English,第二重要是python。虽然是句玩笑,但足以体现了python的强大。233333~~~