关于pymongo的一些问题

本人最近使用新接触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. 插入多级字段数据

      insert怎么用我就不做介绍了,大家自行baidu或google。
      然而我在写代码时,遇见这样一个问题:
      {
          "_id" : ObjectId("58121b864c26bf241b000056"),
          “teacher":"MrWang"
          "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~~~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值