【python】详解pymongo库的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/brucewong0516/article/details/82912514

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" : "[email protected]",
           "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': '[email protected]', 'iphone': '10101010'}}

result = db.smart.find_one({"contact.iphone":"10101010"})
print(result["contact"]["email"])

[email protected]

#多级路径下修改操作
result = db.smart.update({"contact.iphone":"10101010"},{"$set":{"contact.email":"[email protected]"}})
result1 = db.smart.find_one({"contact.iphone":"10101010"})
print(result1["contact"]["email"])

[email protected]
  • 还可以对数组用索引操作
dic = {"name":"lii",
       "age":18,
       "contact" : [
           {
           "email" : "[email protected]",
           "iphone" : "111"},
           {
           "email" : "[email protected]",
           "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': '[email protected]', 'iphone': '111'}, {'email': '[email protected]', 'iphone': '222'}]}

result = db.smart.update({"contact.1.iphone":"222"},{"$set":{"contact.1.email":"[email protected]"}})
print(result1["contact"][1]["email"])

[email protected]

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...

猜你喜欢

转载自blog.csdn.net/brucewong0516/article/details/82912514
今日推荐