开始之前,安装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'}})