python操作数据库MongoDB常用的方法,python mongodb update 更新插入和不更新插入,MongoDB之upsert(更新插入)

1、更新多条数据
update_many(self, filter, update, upsert=False,bypass_document_validation=False, collation=None)
upsert=False,表示在筛选不到数据时 ,不插入

   upsert=True,在筛选不到数据时,插入,但是只会插入筛选的字段
   例如:  

         db[MONGO_TABLE].update_many({"entId": data["entId"]}, {"$set": {"entData": data["entData"]}})

         数据库中只会插入entId和entData字段信息,别的字段则不会插入数据库

 该API返回的结果是更新的条数,用matched_count来获得
         aa = db[MONGO_TABLE].update_many({"entId": data["entId"]}, {"$set": {"entData": data["entData"]}})

         if aa.matched_count == 0:

                db[MONGO_TABLE].insert(data)

————————————————
版权声明:本文为CSDN博主「wddzz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41601173/article/details/81669922

upsert: 更新插入

顾名思义就是更新插入的意思。常规的update其语义:如果找到符合条件的文档就会更新满足匹配条件的文档,如果找不到就不更新。而加上upsert之后其语义为:如果找到满足条件的文档就更新之,如果没找到就创建之。相当于说我们不必预先创建对应的数据,同一套代码既可以用于创建文档又可以更新文档。

测试如下:

#集合没有满足条件的数据,执行普通update;
db.collection_330.update({time:1500000009},{$set:{weight:"100kg"}});
#查询并没有目标数据
db.collection_330.find({time:1500000009});
 
 
#执行upsert(更新插入)
db.collection_330.update({time:1500000009},{$set:{weight:"100kg"}}, true);
#果然就插入了这条数据
db.collection_330.find({time:1500000009});
{ "_id" : ObjectId("63415f01da2d91f443a024cd"), "time" : 1500000009, "weight" : "100kg" }

————————————————
版权声明:本文为CSDN博主「焱齿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mijichui2153/article/details/127214758

**

python操作mongodb的基本常用方法
**

MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活。在这一节中,我们就来看看Python 3下MongoDB的存储操作。

准备工作

所以开始之前我们要确保安装好Mongodb和启动其服务,并安装好python的pymongo,这次我们就展示一下如何操作常用的命令。 进入命令 mongo

python操作的三个必须步骤

import pymongo


class MyMongoDB():
    def __int__(self, database, collection):    #定义参数接收指定的数据库和集合
        self.client = pymongo.MongoClient()     #连接MongoDB
        Self.db = self.client[database]         #指定数据库
        self.col = self.db[collection]          #指定集合

定义一个类,然后将函数封装起来,这样我们就可以传入指定的数据库和集合,然后再封装到属性里面

student = MyMongoDB('one','student')
print(list(student.col.find()))

#输出[]

这个时候我们就可以实例化,我们可以去连接指定的数据库。我新建一个数据库和集合
因为one库里面没有数据所以不会显示

1.插入insert

 def insert(self, data, onlyOne = True):
        if not isinstance(onlyOne,bool):
            raise TypeError
        self.col.insert_one(data) if onlyOne else self.col.insert_many(data)

       

1.第一个参数接收我们需要的数据
2.第二个参数是默认参数,你是要插入一条数据还是多条数据,如果是插入一条那么就不需要传入第二 个参数,如果是插入多条数据,反之。
3.用isinstance判断,onlyOne是否为第二个参数的类型,然后返回类型错误
4.用三目运算

插入一条数据
student.insert({'name':'one','age':18})

#输出[{'_id': ObjectId('5fc60b76f27f7a7906239bb7'), 'name': 'one', 'age': 18}]

插入多条

# student.insert({'name':'one','age':18})
student.insert([{'name': 'two', 'age': '18'}, {'name': 'three', 'age': 18}])

#报错信息
Traceback (most recent call last):
  File "/home/bd/py_case/Mongodb.py", line 18, in <module>
    student.insert([{'name': 'two', 'age': '18'}, {'name': 'three', 'age': 18}])
  File "/home/bd/py_case/Mongodb.py", line 13, in insert
    self.col.insert_one(data) if onlyOne else self.col.insert_many(data)
  File "/home/bd/.virtualenvs/py3env/lib/python3.6/site-packages/pymongo/collection.py", line 692, in insert_one
    common.validate_is_document_type("document", document)
  File "/home/bd/.virtualenvs/py3env/lib/python3.6/site-packages/pymongo/common.py", line 505, in validate_is_document_type
    "collections.MutableMapping" % (option,))
TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping

Process finished with exit code 1

这个时候就会报错,因为我们默认是只插入一条数据,这个时候我们需要在后面加个false

student.insert([{'name': 'two', 'age': '18'}, {'name': 'three', 'age': 18}],False)

#输出
[{'_id': ObjectId('5fc60b76f27f7a7906239bb7'), 'name': 'one', 'age': 18}, {'_id': ObjectId('5fc60e6b615433bade3b2ce5'), 'name': 'two', 'age': '18'}, {'_id': ObjectId('5fc60e6b615433bade3b2ce6'), 'name': 'three', 'age': 18}]

2.查找find

    def find(self,query = None, onlyOne = True):
        if not isinstance(onlyOne, bool):
            raise TypeError
        return self.col.find_one(query) if onelyOne else self.col.find(query)

1.这里和插入一样,默认查找一条数据,true查一条,false查多条
2.self.col.find()是可以不传参数的,所以可以给他一个默认参数None

1.查找一条数据

print(student.find())

#输出
{'_id': ObjectId('5fc60e6b615433bade3b2ce5'), 'name': 'two', 'age': '18'}

2.带条件查询

print(student.find({'age':18}))


#输出
{'_id': ObjectId('5fc60e6b615433bade3b2ce6'), 'name': 'three', 'age': 18}

3.查找全部数据

print(student.find({'age':18}),False) #或者print(student.find(onlyOne = False)


#输出
[{'_id': ObjectId('5fc615669ccaa9d8775af296'), 'name': 'one'}, {'_id': ObjectId('5fc6156d286a7c9919d5b89c'), 'name': 'two', 'age': '18'}, {'_id': ObjectId('5fc6156d286a7c9919d5b89d'), 'name': 'three', 'age': 18}]

接下来就不多说其实思路都是差不多的

3.修改update

    def update(self, data, new_data, onlyOne=True):
        if not isinstance(onlyOne, bool):
            raise TypeError
        self.col.update_one(data, {'$set': new_data}) if onlyOne else self.col.update_many(data, {'$set': new_data})
#我们现在修改age,我插入age都是18,我现在修改为20
student.update({'age': {'$eq': 18}}, {'age': 20}, False)#修改多条数据

#输出
[{'_id': ObjectId('5fc6156d286a7c9919d5b89d'), 'name': 'three', 'age': 20}, {'_id': ObjectId('5fc61d605420c703577ad20b'), 'name': 'one', 'age': 20}, {'_id': ObjectId('5fc6205c3152ecb144288b5f'), 'name': 'two', 'age': 20}]

4.删除delete

   def delete(self,data,onlyOne = True):
        if not isinstance(onlyOne,bool):
            raise TypeError
        self.col.delete_one(data) if onlyOne else self.col.delete_many(data)
student.delete({'age': 20})#把第一条的数据给删了

#输出,这个时候没有one同学的数据了
[{'_id': ObjectId('5fc624c77dc2326e28c2b6c4'), 'name': 'two', 'age': 20}, {'_id': ObjectId('5fc624c77dc2326e28c2b6c5'), 'name': 'three', 'age': 20}]


student.delete({'age': 20},Fallse)#把所有数据删除
#或者可以直接这样student.delete({},Fallse)
#输出
[]

MongoDB里面的显示已经查不到了,以上就是python对MongoDB增删改查的操作,封装好后可以创建更多的实例!

最后附上全部代码

import pymongo


class MyMongoDB:
    def __init__(self, database, collection):  # 定义参数接收指定的数据库和集合
        self.client = pymongo.MongoClient()  # 连接MongoDB
        self.db = self.client[database]  # 指定数据库
        self.col = self.db[collection]  # 指定集合

    def insert(self, data, onlyOne=True):
        if not isinstance(onlyOne, bool):
            raise TypeError
        self.col.insert_one(data) if onlyOne else self.col.insert_many(data)

    def find(self, query=None, onlyOne=True):
        if not isinstance(onlyOne, bool):
            raise TypeError
        return self.col.find_one(query) if onlyOne else self.col.find(query)

    def update(self, data, new_data, onlyOne=True):
        if not isinstance(onlyOne, bool):
            raise TypeError
        self.col.update_one(data, {'$set': new_data}) if onlyOne else self.col.update_many(data, {'$set': new_data})

    def delete(self, data, onlyOne=True):
        if not isinstance(onlyOne, bool):
            raise TypeError
        self.col.delete_one(data) if onlyOne else self.col.delete_many(data)


# student = MyMongoDB('one', 'student')
# student.insert({'name': 'one', 'age': 18})
# # student.insert([{'name': 'two', 'age': 18}, {'name': 'three', 'age': 18}],False)
# # print(list(student.col.find()))
# # student.update({'age': {'$eq': 18}}, {'age': 20}, False)
# student.delete({},False)
# print(list(student.find(onlyOne=False)))


————————————————
版权声明:本文为CSDN博主「楠箜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_50679936/article/details/110437659

您可能还喜欢...

发表回复