MongoDB极简教程 · Mongo · NoSQL

pymongo使用

2017-05-24  本文已影响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'}})


上一篇下一篇

猜你喜欢

热点阅读