pymongo使用

作者: 这才是真的帅气的昵称 | 来源:发表于2017-05-24 15:06 被阅读33次

    Tutorial

    开始之前,安装PyMongo和Mongo。

    import pymongo
    
    client= pymongo.MongoClient(MONGO_URL)
    db = client[MONGO_DB]
    collection = db[MONGO_TABLE]
    

    插入操作

    >>> posts = db.posts
    >>> posts.insert(post) # 将post数据插入posts数据表
    

    查询一条数据:

    >>> posts.find_one()
    

    批量插入

    >>> new_posts = [{"author": "Mike",
    ...        "text": "Another post!",
    ...        "tags": ["bulk", "insert"],
    ...        "date": datetime.datetime(2009, 11, 12, 11, 14)},
    ...       {"author": "Eliot",
    ...        "title": "MongoDB is fun",
    ...        "text": "and pretty easy too!",
    ...        "date": datetime.datetime(2009, 11, 10, 10, 45)}]
    >>> result = posts.insert_many(new_posts)
    >>> result.inserted_ids
    [ObjectId('...'), ObjectId('...')]
    

    查找多条数据:

    >>> for post in posts.find():
    ...  post
    ...
    {u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
    {u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}
    {u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('...'), u'author': u'Eliot', u'title': u'MongoDB is fun'}
    

    约束查找条件:
    比如查询所有作者是 “Mike”的文章:

    >>> for post in posts.find({"author": "Mike"}):
    ...  post
    ...
    {u'date': datetime.datetime(...), u'text': u'My first blog post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'mongodb', u'python', u'pymongo']}
    {u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}
    

    多条件查询:
    比如,数据有有title 和intro两个属性,查询两字段都不存在的数据:

    posts.find({ '$and': [ { 'title': {'$exist': 'false'} }, { 'intro': {'$exist': 'false'} } ] })
    

    获取集合的数据条数:

    >>> posts.count()
    

    或者说满足某种查找条件的数据条数:

    >>> posts.find({"author": "Mike"}).count()
    

    范围查找,比如说时间范围:

    >>> d = datetime.datetime(2009, 11, 12, 12)
    >>> for post in posts.find({"date": {"$lt": d}}).sort("author"):
    ...  print post
    ...
    {u'date': datetime.datetime(2009, 11, 10, 10, 45), u'text': u'and pretty easy too!', u'_id': ObjectId('...'), u'author': u'Eliot', u'title': u'MongoDB is fun'}
    {u'date': datetime.datetime(2009, 11, 12, 11, 14), u'text': u'Another post!', u'_id': ObjectId('...'), u'author': u'Mike', u'tags': [u'bulk', u'insert']}
    

    $lt是小于的意思。

    如何建立索引呢?比如说下面这个查找:

    >>> posts.find({"date": {"$lt": d}}).sort("author").explain()["cursor"]
    u'BasicCursor'
    >>> posts.find({"date": {"$lt": d}}).sort("author").explain()["nscanned"]
    

    建立索引:

    >>> from pymongo import ASCENDING, DESCENDING
    >>> posts.create_index([("date", DESCENDING), ("author", ASCENDING)])
    u'date_-1_author_1'
    >>> posts.find({"date": {"$lt": d}}).sort("author").explain()["cursor"]
    u'BtreeCursor date_-1_author_1'
    >>> posts.find({"date": {"$lt": d}}).sort("author").explain()["nscanned"]
    

    查询结果排序

    >>> posts.find().sort("UserName") #默认为升序
    >>> posts.sort("UserName",pymongo.ASCENDING)  #升序
    >>> posts.sort("UserName",pymongo.DESCENDING) #降序
    

    聚集查询结果多列排序

    >>> posts.find().sort([("UserName",pymongo.ASCENDING),("Email",pymongo.DESCENDING)])
    
    修改记录
    >>>  posts.update({"UserName":"libing"},{"$set":{"Email":"libing@126.com","Password":"123"}})
    

    删除记录

    
    >>>  posts.delete_one({"UserName":"keyword"})  # 删除满足条件的一条数据
    >>>  posts.delete_many({"UserName":"keyword"}) #删除满足条件的数据
    

    筛选出不存在某字段的数据,并执行修改操作:

    #筛选出所有未发布的文章,并执行发表操作
        for i in posts.find({"published": { "$exists" : False }}):
    
            print(i['link'])#打印出文章链接
          
            posts.update({'link':i['link']},{'$set':{'published':'yes'}}) # 对匹配该链接的数据,新增字段published,并设为yes
    

    aggregate

    to_update=book_list.aggregate([
        {'$match': {'$or': [{'update': {'$lte': '2017-06-18'}}, {'update':{"$exists" : False}}]}},
        #用$match筛选符合条件的数据:这里是update字段小于等于 '2017-06-18'或不存在
        {'$project':{'link':1}}
        # $project:修改输出结构,这里表示只输出符合条件数据的link字段。
        #输出结构为:
        # [{'link': 'http://www.xxxxx', '_id': ObjectId('58d469f5')},
        #  {'link': 'http://www.ddddd', '_id': ObjectId('b8cf09ca')},
        #                  ... 
        # ]
    ])
    

    字段更名

    我们发现在上面的例子里,book_list有一个名为update的字段,由于update是数据库的关键字,在具体应用时,会报关键字冲突的错误,我们需要将其更名,方法和之前的例子类似:

    #筛选出所有update字段存在的数据
    for i in book_list.find({"update": { "$exists" : True }}):
    
        print(i['link'])#打印出文章链接
        # 对匹配该链接的数据,将update字段更名为update_time字段
        book_list.update({'link':i['link']},{'$rename':{'update':'update_time'}})
    
    
    

    相关文章

      网友评论

        本文标题:pymongo使用

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