1、连接mongodb,创建client
传入 ip 值或者 localhost ,端口是27017
import pymongo
from pymongo import MongoClient
client = MongoClient()
#连接到本地
client = MongoClient('mongodb://localhost:27017/')
#或者
client = MongoClient('localhost', 27017)
#如果是远程数据库,将 localhost 改为 ip 地址即可
client = MongoClient('172.169.11.51',27017)
2、连接数据库
db = client.Aicoin_db
db
Out[2]: Database(MongoClient(host=['172.169.11.51:27017'], document_class=dict, tz_aware=False, connect=True), 'Aicoin_db')
db = client['Aicoin_db']
db
Out[3]: Database(MongoClient(host=['172.169.11.51:27017'], document_class=dict, tz_aware=False, connect=True), 'Aicoin_db')
3、连接表collection
my_set = db.huobiprohtusdt #使用test_set集合,没有则自动创建
db.huobiprohtusdt
Out[4]: Collection(Database(MongoClient(host=['172.169.11.51:27017'], document_class=dict, tz_aware=False, connect=True), 'Aicoin_db'), 'huobiprohtusdt')
#或者
db['huobiprohtusdt']
Collection(Database(MongoClient(host=['172.169.11.51:27017'], document_class=dict, tz_aware=False, connect=True), 'Aicoin_db'), 'huobiprohtusdt')
4、insert 插入操作
使用JSON样式的文档表示(并存储)MongoDB中的数据。在PyMongo中,使用字典来表示文档。
import datetime
post = {"author": "bruce",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
db = client['test']
myset = db.smart
myset.insert(post)
插入文档时"_id",如果文档尚未包含"_id"密钥,则会自动添加特殊键。"_id"整个集合中的值必须是唯一的。insert_one()返回一个实例InsertOneResult。通过 insert 键入post插入:
list(myset.find({'author':'bruce'}))
Out[5]:
[{'_id': ObjectId('5bb0b0829c90e04d4c6a732d'),
'author': 'bruce',
'date': datetime.datetime(2018, 9, 30, 11, 15, 48, 208000),
'tags': ['mongodb', 'python', 'pymongo'],
'text': 'My first blog post!'}]
插入post之后,完成了新建smart集合表、和smart表里post内容的创建。
- insert插入一个列表多条数据不用遍历,效率高, save需要遍历列表,一个个插入
myset.insert([{'author':'smog','bbq':'yes'},{'author':'mosk','bear':'no'}])
Out[221]: [ObjectId('5bb0b34b9c90e04d4c6a732e'), ObjectId('5bb0b34b9c90e04d4c6a732f')]
list(myset.find({}))
Out[222]:
[{'_id': ObjectId('5bb0b0829c90e04d4c6a732d'),
'author': 'bruce',
'date': datetime.datetime(2018, 9, 30, 11, 15, 48, 208000),
'tags': ['mongodb', 'python', 'pymongo'],
'text': 'My first blog post!'},
{'_id': ObjectId('5bb0b34b9c90e04d4c6a732e'), 'author': 'smog', 'bbq': 'yes'},
{'_id': ObjectId('5bb0b34b9c90e04d4c6a732f'), 'author': 'mosk', 'bear': 'no'}]
如果是save,只能一个个的插入:
myset.save([{'author':'smog','bbq':'yes'},{'author':'mosk','bear':'no'}])
Traceback (most recent call last):
File "<ipython-input-223-dcaef1972c1f>", line 1, in <module>
myset.save([{'author':'smog','bbq':'yes'},{'author':'mosk','bear':'no'}])
File "C:\Users\winnie\Anaconda3\lib\site-packages\pymongo\collection.py", line 3128, in save
common.validate_is_document_type("to_save", to_save)
File "C:\Users\winnie\Anaconda3\lib\site-packages\pymongo\common.py", line 453, in validate_is_document_type
"collections.MutableMapping" % (option,))
TypeError: to_save must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping
#单个可插入
myset.save({'author':'kkik','fance':'yes'})
Out[224]: ObjectId('5bb0b3de9c90e04d4c6a7330')
5、find 查询数据
#查询全部
for i in myset.find():
print(i)
#查询"author = bruce"的
for i in myset.find({"author":"bruce"}):
print(i)
print(myset.find_one({"author":"bruce"}))
{'_id': ObjectId('5bb0b0829c90e04d4c6a732d'), 'author': 'bruce', 'text': 'My first blog post!', 'tags': ['mongodb', 'python', 'pymongo'], 'date': datetime.datetime(2018, 9, 30, 11, 15, 48, 208000)}
{'_id': ObjectId('5bb0b34b9c90e04d4c6a732e'), 'author': 'smog', 'bbq': 'yes'}
{'_id': ObjectId('5bb0b34b9c90e04d4c6a732f'), 'author': 'mosk', 'bear': 'no'}
{'_id': ObjectId('5bb0b3de9c90e04d4c6a7330'), 'author': 'kkik', 'fance': 'yes'}
{'_id': ObjectId('5bb0b0829c90e04d4c6a732d'), 'author': 'bruce', 'text': 'My first blog post!', 'tags': ['mongodb', 'python', 'pymongo'], 'date': datetime.datetime(2018, 9, 30, 11, 15, 48, 208000)}
{'_id': ObjectId('5bb0b0829c90e04d4c6a732d'), 'author': 'bruce', 'text': 'My first blog post!', 'tags': ['mongodb', 'python', 'pymongo'], 'date': datetime.datetime(2018, 9, 30, 11, 15, 48, 208000)}
6、更新数据
- 函数表达式
myset.update(
<query>, #查询条件
<update>, #update的对象和一些更新的操作符
{
upsert: <boolean>, # mongodb 默认是false,如果不存在update的记录,是否插入
multi: <boolean>, #可选,mongodb 默认是false,只更新找到的第一条记录
writeConcern: <document> #可选,抛出异常的级别。
}
)
- 实例:
myset.update({"author":"bruce"},{'$set':{"text":'i love py'}})
Out[226]: {'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}
myset.find_one({"author":"bruce"})
Out[227]:
{'_id': ObjectId('5bb0b0829c90e04d4c6a732d'),
'author': 'bruce',
'date': datetime.datetime(2018, 9, 30, 11, 15, 48, 208000),
'tags': ['mongodb', 'python', 'pymongo'],
'text': 'i love py'}
7、删除数据
my_set.remove(
<query>, #(可选)删除的文档的条件
{
justOne: <boolean>, #(可选)如果设为 true 或 1,则只删除一个文档
writeConcern: <document> #(可选)抛出异常的级别
}
)
- 实例
#删除'author': 'bruce'的全部记录
myset.remove({'author': 'bruce'})
#删除'author':'kkik的某个id的记录
id = myset.find_one({'author':'kkik'})["_id"]
myset.remove(id)
Out[6]: {'n': 1, 'ok': 1.0}
myset.find_one({'author':'bruce'})
#返回NaN
myset.find_one({'author':'kkik'})
#返回NaN
#删除集合里的所有记录
db.smart.remove()
Out[7]: {'n': 2, 'ok': 1.0}
list(myset.find())
Out[8]: []
8、mongodb的条件操作符
# (>) 大于 - $gt
# (<) 小于 - $lt
# (>=) 大于等于 - $gte
# (<= ) 小于等于 - $lte
- 实例:
db.smart.insert([{'BB':5,'book':'Y'},{'BB':5,'juice':'Y'},{'BB':5,'shit':'Y'},{'BB':5,'lover':'N'}])
Out[8]:
[ObjectId('5bb0bc3e9c90e04d4c6a7331'),
ObjectId('5bb0bc3e9c90e04d4c6a7332'),
ObjectId('5bb0bc3e9c90e04d4c6a7333'),
ObjectId('5bb0bc3e9c90e04d4c6a7334')]
list(db.smart.find())
Out[9]:
[{'BB': 5, '_id': ObjectId('5bb0bc3e9c90e04d4c6a7331'), 'book': 'Y'},
{'BB': 5, '_id': ObjectId('5bb0bc3e9c90e04d4c6a7332'), 'juice': 'Y'},
{'BB': 5, '_id': ObjectId('5bb0bc3e9c90e04d4c6a7333'), 'shit': 'Y'},
{'BB': 5, '_id': ObjectId('5bb0bc3e9c90e04d4c6a7334'), 'lover': 'N'}]
for i in list(db.smart.find({"BB":{"$gt":1}})):
print(i)
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7331'), 'BB': 5, 'book': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7332'), 'BB': 5, 'juice': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7333'), 'BB': 5, 'shit': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7334'), 'BB': 5, 'lover': 'N'}
9、type(判断类型)
Double 1
String 2
Object 3
Array 4
Binary data 5
Undefined 6 已废弃
Object id 7
Boolean 8
Date 9
Null 10
Regular Expression 11
JavaScript 13
Symbol 14
JavaScript (with scope) 15
32-bit integer 16
Timestamp 17
64-bit integer 18
Min key 255 Query with -1.
Max key 127
- 实例
for i in list(db.smart.find({"BB":{"$type":16}})): #32-bit intege 32位整型
print(i)
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7331'), 'BB': 5, 'book': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7332'), 'BB': 5, 'juice': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7333'), 'BB': 5, 'shit': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7334'), 'BB': 5, 'lover': 'N'}
10、SORT-POP-PILL-IN-OR-ALL-LIMIT-SKIP
- 在MongoDB中使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序,-1为降序。
for i in db.smart.find().sort([("BB",1)]):
print(i)
{'_id': ObjectId('5bb0be259c90e04d4c6a7335'), 'BB': 1, 'biik': 'Y'}
{'_id': ObjectId('5bb0be259c90e04d4c6a7336'), 'BB': 2, 'jddce': 'Y'}
{'_id': ObjectId('5bb0be259c90e04d4c6a7337'), 'BB': 3, 'shiiit': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7331'), 'BB': 5, 'book': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7332'), 'BB': 5, 'juice': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7333'), 'BB': 5, 'shit': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7334'), 'BB': 5, 'lover': 'N'}
{'_id': ObjectId('5bb0be259c90e04d4c6a7338'), 'BB': 7, 'loveffr': 'N'}
- limit和skip
#limit()方法用来读取指定数量的数据
#skip()方法用来跳过指定数量的数据
for i in db.smart.find().skip(2).limit(6):
print(i)
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7333'), 'BB': 5, 'shit': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7334'), 'BB': 5, 'lover': 'N'}
{'_id': ObjectId('5bb0be259c90e04d4c6a7335'), 'BB': 1, 'biik': 'Y'}
{'_id': ObjectId('5bb0be259c90e04d4c6a7336'), 'BB': 2, 'jddce': 'Y'}
{'_id': ObjectId('5bb0be259c90e04d4c6a7337'), 'BB': 3, 'shiiit': 'Y'}
{'_id': ObjectId('5bb0be259c90e04d4c6a7338'), 'BB': 7, 'loveffr': 'N'}
- IN
#找出BB是1、3的数据
for i in db.smart.find({"BB":{"$in":(1,3)}}):
print(i)
{'_id': ObjectId('5bb0be259c90e04d4c6a7335'), 'BB': 1, 'biik': 'Y'}
{'_id': ObjectId('5bb0be259c90e04d4c6a7337'), 'BB': 3, 'shiiit': 'Y'}
- OR
#找出BB是2或BB是5的记录
for i in db.smart.find({"$or":[{"BB":2},{"BB":5}]}):
print(i)
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7331'), 'BB': 5, 'book': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7332'), 'BB': 5, 'juice': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7333'), 'BB': 5, 'shit': 'Y'}
{'_id': ObjectId('5bb0bc3e9c90e04d4c6a7334'), 'BB': 5, 'lover': 'N'}
{'_id': ObjectId('5bb0be259c90e04d4c6a7336'), 'BB': 2, 'jddce': 'Y'}
- all
aa = {"bb":"sad","age":19,"fg":[2,3]}
vv = {"bb":"joke","age":29,"fg":[1,2,3,4,5,6]}
db.smart.insert([aa,vv])
Out[256]: [ObjectId('5bb0bfcf9c90e04d4c6a7339'), ObjectId('5bb0bfcf9c90e04d4c6a733a')]
for i in db.smart.find({'fg':{'$all':[1,2,3,4]}}):
print(i)
{'_id': ObjectId('5bb0bfcf9c90e04d4c6a733a'), 'bb': 'joke', 'age': 29, 'fg': [1, 2, 3, 4, 5, 6]}
- pop/pull/pullAll
1、pop移除最后一个元素
#pop
#移除最后一个元素(-1为移除第一个)
db.smart.update({'bb':'joke'}, {'$pop':{'fg':1}})
for i in db.smart.find({'bb':'joke'}):
print(i)
{'_id': ObjectId('5bb0bfcf9c90e04d4c6a733a'), 'bb': 'joke', 'age': 29, 'fg': [1, 2, 3, 4, 5]}
2、pull 按值移除
db.smart.update({'bb':'joke'}, {'$pull':{'fg':3}})
Out[263]: {'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}
3、pullAll移除全部符合条件的
db.smart.update({'bb':'joke'}, {'$pullAll':{'fg':[1,2,4]}})
Out[266]: {'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}
11、多级路径元素操作
#多级目录用. 连接查找
dic = {"name":"bruce",
"age":20,
"contact" : {
"email" : "8888888@qq.com",
"iphone" : "10101010"}
}
db.smart.insert(dic)
Out[267]: ObjectId('5bb0c5ba9c90e04d4c6a733b')
for i in db.smart.find({"contact.iphone":"10101010"}):
print(i)
{'_id': ObjectId('5bb0c5ba9c90e04d4c6a733b'), 'name': 'bruce', 'age': 20, 'contact': {'email': '8888888@qq.com', 'iphone': '10101010'}}
result = db.smart.find_one({"contact.iphone":"10101010"})
print(result["contact"]["email"])
8888888@qq.com
#多级路径下修改操作
result = db.smart.update({"contact.iphone":"10101010"},{"$set":{"contact.email":"9999999@qq.com"}})
result1 = db.smart.find_one({"contact.iphone":"10101010"})
print(result1["contact"]["email"])
9999999@qq.com
- 还可以对数组用索引操作
dic = {"name":"lii",
"age":18,
"contact" : [
{
"email" : "111111@qq.com",
"iphone" : "111"},
{
"email" : "222222@qq.com",
"iphone" : "222"}
]}
db.smart.insert(dic)
Out[295]: ObjectId('5bb0c8789c90e04d4c6a733f')
result1 = db.smart.find_one({"contact.1.iphone":"222"})
print(result1)
{'_id': ObjectId('5bb0c6979c90e04d4c6a733c'), 'name': 'bruceLi', 'age': 21, 'contact': [{'email': '111111@qq.com', 'iphone': '111'}, {'email': '222222@qq.com', 'iphone': '222'}]}
result = db.smart.update({"contact.1.iphone":"222"},{"$set":{"contact.1.email":"222222@qq.com"}})
print(result1["contact"][1]["email"])
222222@qq.com
12、完整脚本
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from pymongo import MongoClient
settings = {
"ip":'localhost', #ip
"port":27017, #端口
"db_name" : "mydb", #数据库名字
"set_name" : "test_set" #集合名字
}
class MyMongoDB(object):
def __init__(self):
try:
self.conn = MongoClient(settings["ip"], settings["port"])
except Exception as e:
print(e)
self.db = self.conn[settings["db_name"]]
self.my_set = self.db[settings["set_name"]]
def insert(self,dic):
print("inser...")
self.my_set.insert(dic)
def update(self,dic,newdic):
print("update...")
self.my_set.update(dic,newdic)
def delete(self,dic):
print("delete...")
self.my_set.remove(dic)
def dbfind(self,dic):
print("find...")
data = self.my_set.find(dic)
for result in data:
print(result["name"],result["age"])
def main():
dic={"name":"bruce","age":20}
mongo = MyMongoDB()
mongo.insert(dic)
mongo.dbfind({"name":"bruce"})
mongo.update({"name":"bruce"},{"$set":{"age":"25"}})
mongo.dbfind({"name":"bruce"})
mongo.delete({"name":"bruce"})
mongo.dbfind({"name":"bruce"})
if __name__ == "__main__":
main()
inser...
find...
bruce 20
update...
find...
bruce 25
delete...
find...