笔记-python lib-pymongo

 

1.      开始

 

pymongo是python版的连接库,最新版为3.7.2。

文档地址:https://pypi.org/project/pymongo/

使用文档:http://api.mongodb.com/python/current/tutorial.html

The PyMongo distribution contains tools for interacting with MongoDB database from Python. The bsonpackage is an implementation of the BSON format for Python. The pymongo package is a native Python driver for MongoDB. The gridfs package is a gridfs implementation on top of pymongo.

PyMongo supports MongoDB 2.6, 3.0, 3.2, 3.4, 3.6 and 4.0.

 

 

1.1.    安装

python –m pip isntall pymongo

 

1.2.    问题

使用ip始终连接不上,可能是在mongodb的设置中被绑定到127.0.0.1上了,使用localhost连接成功。

 

 

1.3.    常用操作

 

# pymongodb 常用操作


import pymongo

import time

import string

 

# 数据库相关信息

mongodb_info = ['192.168.199.113', 27017]

 

# 1. connect to mongodb,get database, get collection

"""

连接MongoDB我们需要使用PyMongo库里面的MongoClient,一般来说传入MongoDB的IP及端口即可,第一个参数为地址host,

第二个参数为端口port,端口如果不传默认是27017。

client = MongoClient('localhost', 27017)

第一个参数还可以传mongodb的连接字符串,

client = MongoClient('mongodb://localhost:27017/')可以达到同样的连接效果。

"""

conn = pymongo.MongoClient('localhost')

 

 

# 指明database,如果不存在则创建

# 也可以写为db = conn['test_database']

db = conn.test_database

# db1 = conn.a仅代表a而不代表a所指向的变量,下面会创建名为a的database而非aaa

#a = 'aaa'

#db1 = conn.a



# 指定collection

# 在指定collection名时也是如此,下面的语句会创建a而不是aaa

# 类似的,也可以写作coll = db['a']

coll = db.a

coll_test = db.test

#coll.insert({'rt':452423})




'''

# 3.集合管理

# 新增一个集合a

new_coll = db.a

# 注意,这时并没有创建集合,只有在插入数据时才会创建


# 删除集合

coll_2 = db.test_delete

result = coll_2.insert({'delete_test':'delete the collection'})

print(result)

db.drop_collection('test_delete')


# 查询所有集合

db_coll_name = db.collection_names(include_system_collections=False)

print(db_coll_name)

'''



# 实验环境创建

'''

chars = string.ascii_lowercase

li = [{chars[x]:x} for x in range(26)]

print(li)

coll_test = db.test

db.drop_collection('test')

coll_test.insert_one({'x':6}) # 自动生成_id

for i,j in enumerate(li):

    coll_test.insert_one({'_id':i,**j}) # 指定_id

'''




'''

# 4. 数据操作


# 插入,每条数据有一个_id属性来唯一标识,如果没有显示指定,mongodb会自动生成一个

# 重复执行多次会插入多次

# insert 会返回_id

result = coll.insert({'key1':'sam','key2':'jack'})

print(result)


# 一次插入多条记录,记录以列表方式组织,列表每个元素代表一个记录

# 返回的结果是对应的_id的集合

# 在3.0版以后,官方推荐使用insert_one() and insert_many(),当然insert()也可以继续使用

#result = collection.insert([student1, student2])


# insert_one()

# 它返回的是一个pymongo.results.InsertOneResult对象,可以使用inserted_id获取_id

result = coll.insert_one({'insert_one':'1'})

print(result)

print(result.inserted_id)


# insert_many()

#




# 2.2 删除document

# 老版本的是remove,新版推荐使用delete_one

# 删除一个文档,如果该文档不存在,不会报错

# 没有指定参数则会删除前面的一个文档

print(coll_test.count_documents({}))

result = coll_test.delete_one({})

print(result.deleted_count)



# delete_many()

# 删除所有符合条件的文档



# 另外PyMongo还提供了一些组合方法,如find_one_and_delete()、find_one_and_replace()、find_one_and_update(),

# 就是查找后删除、替换、更新操作,用法与上述方法基本一致。

'''


# 2.3 修改

item = coll_test.find_one({'a':100})

print(item)

item['a'] = 200

result = coll_test.update({'a':100},item)

#result = coll_test.find_one_and_replace({'a':0},{'a':100})

print(result)

# 输出:{'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}

# 返回结果是字典形式,ok即代表执行成功,nModified代表影响的数据条数。


# 另外update()方法其实也是官方不推荐使用的方法,在这里也分了update_one()方法和update_many()方法,用法更加严格,



'''

# 2.4

# 集合数据

# 统计集合中文档的数量

# count_documents({})

doc_nums = coll.count_documents({})

print(doc_nums)   



# 2.4.2 查询文档

# find_one() 获取一个collection

# 返回字典

# {'_id': ObjectId('5c162016e771231e84d078bf'), 'key1': 'sam', 'key2': 'jack'}

# _id是自动添加的字段

result = coll.find_one({'key1':'sam'})


# find()获取多个document 返回一个cursor对象

result = coll.find()

print(result) # <pymongo.cursor.Cursor object at 0x000000A566BD8C18>


# 打印所有满足条件的document

for _ in coll.find():

    # print(type(_)) # <class 'dict'>

    print(_)



# 根据objectid查询

# 注意,系统自动生成的id是一个对象而不是字符串

id = '5c162008e771231f0c96c0fa'

result = coll.find_one({'_id':id})

# 做一下类型转换

from bson.objectid import  ObjectId

result = coll.find_one({'_id':ObjectId('5c162008e771231f0c96c0fa')})

print(result)


# 如果自己给定了_id 当然可以了

result = coll_test.find_one({'_id':4})

print(result)




# 条件查询

#d = [{'name':'a','age':15},{'name':'b','age':18},{'name':'c','age':23},{'name':'d','age':33}]

#coll_test.insert_many(d)

# 各数据库差不多,注意语法即可

result = coll_test.find({'age':{'$lt':20}})

print(list(result))


# 在这里将比较符号归纳如下表:

"""

符号含义示例

$lt小于{'age': {'$lt': 20}}

$gt大于{'age': {'$gt': 20}}

$lte小于等于{'age': {'$lte': 20}}

$gte大于等于{'age': {'$gte': 20}}

$ne不等于{'age': {'$ne': 20}}

$in在范围内{'age': {'$in': [20, 23]}}

$nin不在范围内{'age': {'$nin': [20, 23]}}

"""


# 正则也可以

results = collection.find({'name': {'$regex': '^M.*'}})

# 在这里使用了$regex来指定正则匹配,^M.*代表以M开头的正则表达式,这样就可以查询所有符合该正则的结果。


# 在这里将一些功能符号再归类如下:

"""

符号含义示例示例含义

$regex匹配正则{'name': {'$regex': '^M.*'}}name以M开头

$exists属性是否存在{'name': {'$exists': True}}name属性存在

$type类型判断{'age': {'$type': 'int'}}age的类型为int

$mod数字模操作{'age': {'$mod': [5, 0]}}年龄模5余0

$text文本查询{'$text': {'$search': 'Mike'}}text类型的属性中包含Mike字符串

$where高级条件查询{'$where': 'obj.fans_count == obj.follows_count'}自身粉丝数等于关注数

"""

# 这些操作的更详细用法在可以在MongoDB官方文档找到:

# https://docs.mongodb.com/manual/reference/operator/query/



# 计数

count = coll_test.find().count()

print(count)

print(coll_test.count_documents({}))


# 排序

result = coll_test.find().sort('name',pymongo.ASCENDING)

print(list(result))



'''