python操作MongoDB(插、查、改、排、删)

时间:2022-09-30 14:53:19

???????????????????????????????????????????????????????????? 

???? 博客首页:knighthood2001

???? 欢迎点赞????评论????️

❤️ 热爱python,期待与大家一同进步成长!!❤️

????给大家推荐一款很火爆的刷题、面试求职网站????

跟我一起来巩固基础、开启刷题之旅吧

MongoDB 是一个基于分布式文件存储的数据库。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。

目录

插入文档

插入集合

返回 _id 字段

插入多个文档

插入指定 _id 的多个文档

查询文档

查询一条数据

查询集合中所有数据

查询指定字段的数据

根据指定条件查询

高级查询

返回指定条数记录

修改文档

排序

删除数据

删除多个文档

删除集合中的所有文档

删除集合


首先需要安装MongoDB,安装过程就不详细赘述了????????

然后Python 要连接 MongoDB 需要 MongoDB 驱动,用pip安装

pip install pymongo

以下内容均来自牛客网(一个对新手非常友好的网站,里面内容多,包含刷题、面试等资料) 笔者略作更改,希望能帮助到大家!!


插入文档

        MongoDB 中的一个文档类似 SQL 表中的一条记录。

插入集合

        集合中插入文档使用 insert_one() 方法,该方法的第一参数是字典 name => value 对。

例:向 sites 集合中插入文档

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

mydict = { "name": "NOWCODER", "alexa": "10000", "url": "https://www.nowcoder.com" }

x = mycol.insert_one(mydict) 
print(x)
print(x)

结果如下:

<pymongo.results.InsertOneResult object at 0x10a34b288>

返回 _id 字段

        insert_one() 方法返回 InsertOneResult 对象,该对象包含 inserted_id 属性,它是插入文档的 id 值。

import pymongo

myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient['nowcoderdb']
mycol = mydb["sites"]

mydict = { "name": "Google", "alexa": "1", "url": "https://www.google.com" }

x = mycol.insert_one(mydict)
print(x.inserted_id)

结果如下: 

5b2369cac315325f3698a1cf

插入多个文档

        集合中插入多个文档使用 insert_many() 方法,该方法的第一参数是字典列表。

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

mylist = [
  { "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" },
  { "name": "QQ", "alexa": "101", "url": "https://www.qq.com" },
  { "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" },
  { "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" },
  { "name": "Github", "alexa": "109", "url": "https://www.github.com" }
]

x = mycol.insert_many(mylist)

# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)

输出结果类似如下:

[ObjectId('5b236aa9c315325f5236bbb6'), ObjectId('5b236aa9c315325f5236bbb7'), ObjectId('5b236aa9c315325f5236bbb8'), ObjectId('5b236aa9c315325f5236bbb9'), ObjectId('5b236aa9c315325f5236bbba')]

插入指定 _id 的多个文档

        我们也可以自己指定 id,插入,以下实例我们在 site2 集合中插入数据,_id 为我们指定的:

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["site2"]

mylist = [
  { "_id": 1, "name": "NOWCODER", "cn_name": "牛客教程"},
  { "_id": 2, "name": "Google", "address": "Google 搜索"},
  { "_id": 3, "name": "Facebook", "address": "脸书"},
  { "_id": 4, "name": "Taobao", "address": "淘宝"},
  { "_id": 5, "name": "Zhihu", "address": "知乎"}
]

x = mycol.insert_many(mylist)

# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)

结果如下:

[1, 2, 3, 4, 5]

查询文档

        MongoDB 中使用了 find find_one 方法来查询集合中的数据,它类似于 SQL 中的 SELECT 语句。

查询一条数据

        我们可以使用 find_one() 方法来查询集合中的一条数据。

例:查询 sites 文档中的第一条数据

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

x = mycol.find_one()
print(x)

结果如下:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'NOWCODER', 'alexa': '10000', 'url': 'https://www.nowcoder.com'}

查询集合中所有数据

        find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

for x in mycol.find():
    print(x)
{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'NOWCODER', 'alexa': '10000', 'url': 'https://www.nowcoder.com'}
{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'alexa': '1', 'url': 'https://www.google.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb8'), 'name': 'Facebook', 'alexa': '10', 'url': 'https://www.facebook.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbba'), 'name': 'Github', 'alexa': '109', 'url': 'https://www.github.com'}

查询指定字段的数据

        我们可以使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }):
    print(x)

结果如下:

{'name': 'NOWCODER', 'alexa': '10000'}
{'name': 'Google', 'alexa': '1'}
{'name': 'Taobao', 'alexa': '100'}
{'name': 'QQ', 'alexa': '101'}
{'name': 'Facebook', 'alexa': '10'}
{'name': '知乎', 'alexa': '103'}
{'name': 'Github', 'alexa': '109'}

根据指定条件查询

        我们可以在 find() 中设置参数来过滤数据。

例:查找 name 字段为 "NOWCODER" 的数据

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

myquery = { "name": "NOWCODER" }
mydoc = mycol.find(myquery)
for x in mydoc:
    print(x)

结果如下:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'NOWCODER', 'alexa': '10000', 'url': 'https://www.nowcoder.com'}

高级查询

        查询的条件语句中,我们还可以使用修饰符。

        以下实例用于读取 name 字段中第一个字母 ASCII 值大于 "H" 的数据,大于的修饰符条件为 {"$gt": "H"} :

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

myquery = { "name": { "$gt": "H" } }
mydoc = mycol.find(myquery)
for x in mydoc:
    print(x)

 结果如下:

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'NOWCODER', 'alexa': '10000', 'url': 'https://www.nowcoder.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb7'), 'name': 'QQ', 'alexa': '101', 'url': 'https://www.qq.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb9'), 'name': '知乎', 'alexa': '103', 'url': 'https://www.zhihu.com'}

返回指定条数记录

        如果我们要对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。

例:返回 3 条文档记录

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

myresult = mycol.find().limit(3)

# 输出结果
for x in myresult:
    print(x)

结果只有三条了: 

{'_id': ObjectId('5b23696ac315325f269f28d1'), 'name': 'NOWCODER', 'alexa': '10000', 'url': 'https://www.nowcoder.com'}
{'_id': ObjectId('5b2369cac315325f3698a1cf'), 'name': 'Google', 'alexa': '1', 'url': 'https://www.google.com'}
{'_id': ObjectId('5b236aa9c315325f5236bbb6'), 'name': 'Taobao', 'alexa': '100', 'url': 'https://www.taobao.com'}

修改文档

        我们可以在 MongoDB 中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。如果查找到的匹配数据多余一条,则只会修改第一条。

例:将 alexa 字段的值 10000 改为 12345

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

myquery = { "alexa": "10000" }
newvalues = { "$set": { "alexa": "12345" } }

mycol.update_one(myquery, newvalues)

# 输出修改后的  "sites"  集合
for x in mycol.find():
    print(x)

update_one() 方法只能修匹配到的第一条记录,如果要修改所有匹配到的记录,可以使用 update_many()

以下实例将查找所有以 F 开头的 name 字段,并将匹配到所有记录的 alexa 字段修改为 123

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

myquery = { "name": { "$regex": "^F" } }
newvalues = { "$set": { "alexa": "123" } }

x = mycol.update_many(myquery, newvalues)
print(x.modified_count, "文档已修改")

排序

        sort() 方法可以指定升序或降序排序。

        sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

mydoc = mycol.find().sort("alexa")
for x in mydoc:
    print(x)

以上代码实现了对字段 alexa 按升序排序。

删除数据

        我们可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

例:删除 name 字段值为 "Taobao" 的文档

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

myquery = { "name": "Taobao" }

mycol.delete_one(myquery)
# 删除后输出
for x in mycol.find():
    print(x)

删除多个文档

        我们可以使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

例:删除所有 name 字段中以 F 开头的文档

import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

myquery = { "name": {"$regex": "^F"} }

x = mycol.delete_many(myquery)
print(x.deleted_count, "个文档已删除")

结果如下:

1 个文档已删除

删除集合中的所有文档

        delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档:

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

x = mycol.delete_many({})
print(x.deleted_count, "个文档已删除")

 结果如下:

5 个文档已删除

删除集合

        我们可以使用 drop() 方法来删除一个集合。

以下实例删除了 customers 集合:

import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["nowcoderdb"]
mycol = mydb["sites"]

mycol.drop()

如果删除成功 drop() 返回 true,如果删除失败(集合不存在)则返回 false。