Python的MongoDB模块PyMongo操作方法集锦
admin
2023-07-31 02:32:55
0

开始之前当然要导入模块啦:

>>> import pymongo

下一步,必须本地mongodb服务器的安装和启动已经完成,才能继续下去。

建立于MongoClient 的连接:

client = MongoClient(\'localhost\', 27017)
# 或者
client = MongoClient(\'mongodb://localhost:27017/\')

得到数据库:

>>> db = client.test_database
# 或者
>>> db = client[\'test-database\']

得到一个数据集合:

collection = db.test_collection
# 或者
collection = db[\'test-collection\']

MongoDB中的数据使用的是类似Json风格的文档:

>>> import datetime
>>> post = {\"author\": \"Mike\",
...     \"text\": \"My first blog post!\",
...     \"tags\": [\"mongodb\", \"python\", \"pymongo\"],
...     \"date\": datetime.datetime.utcnow()}

插入一个文档:

>>> posts = db.posts
>>> post_id = posts.insert_one(post).inserted_id
>>> post_id
ObjectId(\'...\')

找一条数据:

>>> posts.find_one()
{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\']}

>>> posts.find_one({\"author\": \"Mike\"})
{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\']}

>>> posts.find_one({\"author\": \"Eliot\"})
>>>

通过ObjectId来查找:

>>> post_id
ObjectId(...)
>>> posts.find_one({\"_id\": post_id})
{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\']}

不要转化ObjectId的类型为String:

>>> post_id_as_str = str(post_id)
>>> posts.find_one({\"_id\": post_id_as_str}) # No result
>>>

如果你有一个post_id字符串,怎么办呢?

from bson.objectid import ObjectId

# The web framework gets post_id from the URL and passes it as a string
def get(post_id):
  # Convert from string to ObjectId:
  document = client.db.collection.find_one({\'_id\': ObjectId(post_id)})

多条插入:

>>> 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\'}

当然也可以约束查找条件:

>>> 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\']}

获取集合的数据条数:

>>> 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\"]


连接聚集

>>> account = db.Account
#或 
>>> account = db[\"Account\"]

 

查看全部聚集名称

>>> db.collection_names()

 

查看聚集的一条记录

>>> db.Account.find_one()
 

>>> db.Account.find_one({\"UserName\":\"keyword\"})

 

查看聚集的字段

>>> db.Account.find_one({},{\"UserName\":1,\"Email\":1})
{u\'UserName\': u\'libing\', u\'_id\': ObjectId(\'4ded95c3b7780a774a099b7c\'), u\'Email\': u\'libing@35.cn\'}
 

>>> db.Account.find_one({},{\"UserName\":1,\"Email\":1,\"_id\":0})
{u\'UserName\': u\'libing\', u\'Email\': u\'libing@35.cn\'}

 

查看聚集的多条记录

>>> for item in db.Account.find():
    item
 

>>> for item in db.Account.find({\"UserName\":\"libing\"}):
    item[\"UserName\"]

 

查看聚集的记录统计

>>> db.Account.find().count()
 

>>> db.Account.find({\"UserName\":\"keyword\"}).count()

 

聚集查询结果排序

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

 

聚集查询结果多列排序

>>> db.Account.find().sort([(\"UserName\",pymongo.ASCENDING),(\"Email\",pymongo.DESCENDING)])

 

添加记录

>>> db.Account.insert({\"AccountID\":21,\"UserName\":\"libing\"})

 

修改记录

>>> db.Account.update({\"UserName\":\"libing\"},{\"$set\":{\"Email\":\"libing@126.com\",\"Password\":\"123\"}})

 

删除记录

>>> db.Account.remove()  -- 全部删除
 

>>> db.Test.remove({\"UserName\":\"keyword\"})

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...