PyMongo官⽅⽂档翻译和解析
数据库的操作⽆⾮是要掌握数据库的增,改,删,此篇⽂章为查阅官⽅⽂档的翻译和解释。
官⽅⽂档:Tutorial — PyMongo 3.7.1 documentation
Prerequisites先决条件
已经安装了pymongo,并且import pymongo没有报错
(pymongo安装:在cmd中输⼊pip3 install pymongo)
Making a Connection with MongoClient
连接MongoDB实例的客户端
1.from pymongo import MongoClient
client = MongoClient()没有添加参数时,会连接默认的⽤户和端⼝
2.但是可以指定⽤户和端⼝client = MongoClient('localhost', 27017)
3.或者⽤MongoDB URI 形式
client = MongoClient('mongodb://localhost:27017/')
Getting a Database得到数据库
db = st_database
如果数据库名称不能直接⽤客户端.数据名的⽅式引⽤,如test-database
那就使⽤字典的⽅式引⽤:db = client['test-database']
Getting a Collection得到集合
集合(Collection)是MongoDB中的⼀系列⽂件,可以理解为关系数据库中的⼀个表。得到Collection和得到数据库的操作是⼀样的 collection = db.test_collection或者collection = db['test-collection']
注:1.从Getting a Database和Getting a Collection中可以看出,你要先得到⼀个数据库(db是得到的数据库,collection是得到的集合),才能得到数据库中的集合。2.⼀旦有⽂档插⼊的时候集合和数据库就被创建
Documents
MongoDB中的数据都是以JSON的形式存储和展现的,使⽤PyMongo时是⽤字典展⽰⽂档的
import datetime
post = {"author": "Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
Inserting a Document插⼊单个⽂档
把⼀个⽂档插⼊⼀个集合中使⽤ insert_one()
>>> posts = db.posts
#insert_one插⼊⽂档,并⽤inserted_id得到id属性
>>> post_id = posts.insert_one(post).inserted_id
>>> post_id
ObjectId('...')
如果你要插⼊的⽂档字典中没有”_id”这个键,它会为你⾃动⽣成”_id”键和对应的值,每个⽂档都有⾃⼰特别的id。如图,椭圆中的是
每个⽂档的_id,矩形中的表⽰⼀个⽂档
注:只要插⼊了第⼀个⽂档集合就随之创建通过“数据库名.collection_names()”⽅法可以查看数据库中所有的集合
访问单个⽂档
Getting a Single Document With find_one()
得到单个⽂档的⽅法find_one(),结果返回None或者相匹配的⽂档
Querying By ObjectId 通过⽂档id 访问⽂档
>>> db.collection_names(include_system_collections=False )
[u'posts']
>>> import pprint
#没有已知信息匹配,返回了刚刚插⼊的posts
>>> pprint.pprint(posts.find_one())
{u'_id': ObjectId('...'),#_id 是插⼊时MongoDB ⾃动添加的
u'author': u'Mike',#u'author'⽽不是'author'因为PyMongo 解码成unicode string
u'date': datetime.datetime(...),
u'tags': [u'mongodb', u'python', u'pymongo'],
u'text': u'My first blog post!'}
#⽤已知信息"author": "Mike"做匹配
>>> pprint.pprint(posts.find_one({"author": "Mike"}))
{u'_id': ObjectId('...'),
u'author': u'Mike',
u'date': datetime.datetime(...),
u'tags': [u'mongodb', u'python', u'pymongo'],
u'text': u'My first blog post!'}
>>> post_id#⽂档id,见Inserting a Document
ObjectId(...)
>>> pprint.pprint(posts.find_one({"_id": post_id}))
{u'_id': ObjectId('...'),
u'author': u'Mike',
u'date': datetime.datetime(...),
u'tags': [u'mongodb', u'python', u'pymongo'],
u'text': u'My first blog post!'}
>>> post_id_as_str = str(post_id)#⽂档id可转化为字符串形式,但是不能⽤该形式匹配⽂档>>> posts.find_one({"_id": post_id_as_str}) # No result没有返回结果
>>>
如果有str类型的id务必在使⽤find_one⽅法前改为ObjectId类型
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 = llection.find_one({'_id': ObjectId(post_id)})
Bulk Inserts插⼊多个⽂档
使⽤insert_many()⽅法,多个⽂档以列表的形式插⼊
#列表new_posts中有两个字典元素,⼀个字典表⽰⼀个⽂档
>>> 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('...')]
Querying for More Than One Document访问多个⽂档
find()⽅法
#⽆参数输⼊时,打印出该集合所有⽂档
>>> for post in posts.find():
... pprint.pprint(post)
...
{u'_id': ObjectId('...'),
u'author': u'Mike',
u'date': datetime.datetime(...),
u'tags': [u'mongodb', u'python', u'pymongo'],
u'text': u'My first blog post!'}
{u'_id': ObjectId('...'),
u'author': u'Mike',
u'date': datetime.datetime(...),
u'tags': [u'bulk', u'insert'],
u'text': u'Another post!'}
{u'_id': ObjectId('...'),
u'author': u'Eliot',
u'date': datetime.datetime(...),
u'text': u'and pretty easy too!',
u'title': u'MongoDB is fun'}
#有参输⼊时,只打印匹配⽂档
>>> for post in posts.find({"author": "Mike"}):
... pprint.pprint(post)
...
{u'_id': ObjectId('...'),
u'author': u'Mike',
u'date': datetime.datetime(...),
u'tags': [u'mongodb', u'python', u'pymongo'],
u'text': u'My first blog post!'}
{u'_id': ObjectId('...'),
u'author': u'Mike',
u'date': datetime.datetime(...),
u'tags': [u'bulk', u'insert'],
u'text': u'Another post!'}
Counting⽂档计数⽅法
#此⽅法可计算⼀个集合所含的⽂档数
>>> unt()
3
#此⽅法计算集合中满⾜匹配条件的⽂档数
>>> posts.find({"author": "Mike"}).count()
2
Range Queries限定访问范围
>>> d = datetime.datetime(2009, 11, 12, 12)
#"$lt"表⽰限定范围 sort()表⽰由操作者来分类
>>> for post in posts.find({"date": {"$lt": d}}).sort("author"):
... pprint.pprint(post)
.
..
{u'_id': ObjectId('...'),
u'author': u'Eliot',
u'date': datetime.datetime(...),
u'text': u'and pretty easy too!',
u'title': u'MongoDB is fun'}
{u'_id': ObjectId('...'),
u'author': u'Mike',
u'date': datetime.datetime(...),
u'tags': [u'bulk', u'insert'],
u'text': u'Another post!'}
Indexing增加索引
#增加索引,并且是独⼀⽆⼆的
>>> result = ate_index([('user_id', pymongo.ASCENDING)],
... unique=True)
python官方文档中文版#显⽰现有的索引,⼀个是⾃动添加的_id,⼀个是⼿动增加的索引user_id
>>> sorted(list(db.profiles.index_information()))
[u'_id_', u'user_id_1']
>>> user_profiles = [
... {'user_id': 211, 'name': 'Luke'},
... {'user_id': 212, 'name': 'Ziltoid'}]
>>> result = db.profiles.insert_many(user_profiles)
>>> new_profile = {'user_id': 213, 'name': 'Drew'}
>>> duplicate_profile = {'user_id': 212, 'name': 'Tommy'}
>>> result = db.profiles.insert_one(new_profile) # This is fine.
>>> result = db.profiles.insert_one(duplicate_profile)#有重复user_id则报错
Traceback (most recent call last):
DuplicateKeyError: E11000 duplicate key error index: test_database.profiles.$user_id_1 dup key: { : 212 }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论