37创客科创中心

 找回密码
 立即注册
查看: 1782|回复: 0

入门

[复制链接]

194

主题

324

帖子

2405

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2405
发表于 2023-6-1 21:50:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

import pymongo
conn = pymongo.MongoClient()

# 第一种写法
db = conn.chapter_3
handler = db.example_data_1
handler.find_one()
# 第二种写法
db2 = conn['chapter_3']
handler2 = db2['example_data_1']
handler2.find_one()
# 使用第二种写法可以批量处理多个数据库和多个集合
db_name = 'chapter_3'
collection_name = 'example_data_1'
db3 = conn[db_name]
handler3 = db3[collection_name]
handler3.find_one()
row = handler.find_one({'age': 25})
print(row)
rows = handler.find({'age': 25, 'name': '慕容小九'}, {'name': 0, 'address': 0, '_id': 0})
print(rows)
for row in rows:
    print(row)
# MongoDB的基本语法——使用Python插入、更新、删除数据
![]()

## 插入数据

### 基本语法

```
collection.insert_one(字典)  # 插入一条数据
collection.insert_many(包含字典的列表)  # 批量插入多条数据
```

### 被插入的数据格式

```
{'field_1': value_1, 'field_2': value_2}

[
{'field_1': value_1, 'field_2': value_2},
{'field_1': value_3, 'field_2': value_4}
]
```

### 说明

* MongoDB不需要提前创建数据库、不需要提前创建集合、不需要提取定义数据格式,想插入什么数据,直接插就行。
* 同一个集合的不同行数据,字典可以不一样
## 插入一条数据
data = {'name': '青南', 'age': 26, 'address': '杭州'}
handler.insert_one(data)
## 插入一条数据,但是增加一个字段
data = {'name': '青南2', 'age': 26, 'address': '杭州', 'salary': 99999}
handler.insert_one(data)
## 在新的数据库、新的集合里面插入数据

new_handler = conn.video_chapter3.example
new_handler.insert_one({'name': '赵小一', 'birthday': '2019-02-16'})
## 批量插入数据


data = [
    {'name': '王十一', 'age': 25, 'address': '山东'},
    {'name': '马十二', 'age': 24, 'address': '深圳'}
]
handler.insert_many(data)
## 被批量插入的数据,每一条的格式也可以不一样
data = [
    {'name': '周十三', 'age': 23, 'address': '湖南'},
    {'topic': '测试', 'price': 800, 'star': 3}
]
handler.insert_many(data)
## 更新数据

### 基本语法

```
# 更新一条数据
collection.update_one(查询条件, {'$set': 被更新的数据})

# 更新所有满足要求的数据
collection.update_many(查询条件, {'$set': 被更新的数据})
```

### 被更新的数据

```
{'field_1': value_1, 'field_2': value_2}
```

## 更新一条数据
handler.update_one({'age': 25}, {'$set': {'address': '英国'}})
## 更新所有数据
handler.update_many({'age': 25}, {'$set': {'address': '火星'}})
## 更新所有数据,并新增一列
handler.update_many({'age': 25}, {'$set': {'address': '火星', 'type': '火星人'}})
## 删除数据

### 基本语法

```
# 删除第一个满足条件的数据
collection.delete_one(查询条件)

# 删除所有满足条件的数据
collection.delete_many(查询条件)
```

### 查询条件

与查询数据的第一个参数完全相同

### 建议

建议先写查询语句,确认查询出来的数据就是自己想删除的数据,然后把关键字**find**改为**delete_one**或者**delete_many**
## 删除一条数据


rows = handler.delete_one({'age': 25})

## 删除所有数据
handler.delete_many({'age': 25})
# MongoDB的基本语法——条件查询和逻辑查询
![]()

handler = conn.chapter_3.example_data_2
## 查询并对结果进行计数

### 基本语法

```
collection.find().count()
```
handler.find({'grade': '五年级'}).count()
## 查询并排序

### 基本语法

```
# 在Python中

collection.find().sort('字段名', 方向)

# 在Robo 3T的命令输入区域

collection.find().sort({'字段名': 方向})
```

其中方向为**1**表示升序,方向为**-1**表示降序
## 查询并对age升序排序
rows = handler.find().sort('age', 1)
for row in rows:
    print(row)
## 查询并对age降序排序

rows = handler.find().sort('age', -1)
for row in rows:
    print(row)
## 对字段去重

### 基本语法

```
# 对字段去重
handler.distinct('字段名')

# 先筛选再去重
handler.distinct('字段名', 查询条件)
```

### 注意

如果字段的数量很大,那么轻易不要在Robo 3T里面直接执行,否则可能导致Robo 3T卡死。
## 添加一些测试数据
data = [
    {'name': '阚九娃', 'age': 18, 'grade': '四年级', 'student': True, 'interest': '魔术'},
    {'name': '钱十娃', 'age': 18, 'grade': '四年级', 'student': True, 'interest': '直播'},
    {'name': '孙十一娃', 'age': 18, 'grade': '四年级', 'student': True, 'interest': '打架'},
    {'name': '李十二娃', 'age': 18, 'grade': '五年级', 'student': True, 'interest': '模型'},
    {'name': '周十三娃', 'age': 18, 'grade': '五年级', 'student': True, 'interest': '手办'},
]
handler.insert_many(data)
## 对age进行去重
handler.distinct('age')
## 对age为18的数据中的grade字段去重
rows = handler.distinct('grade', {'age': 18})

print(rows)
print(len(rows))
## 逻辑查询

### 基本符号

| 符号 | 意义 |
| --- | --- |
| \$gt | 大于 |
| \$gte | 大于等于 |
| \$lt | 小于 |
| \$lte | 小于等于 |
| \$ne | 不等于 |

### 基本语法

```
collection.find({'字段名': {'基本符号': 边界值, '基本符号': 边界值}})
```
## 查询age 大于15的数据
rows = handler.find({'age': {'$gt': 15}})
for row in rows:
    print(row)
## 查询age大于12小于等于18的数据
rows = handler.find({'age': {'$gt': 12, '$lte': 18}})
for row in rows:
    print(row)
## 查询age为18,年纪不为四年级的数据
rows = handler.find({'age': 18, 'grade': {'$ne': '四年级'}})
for row in rows:
    print(row)
## 或查询

### 基本语法

```
handler.find({'$or': [查询条件1, 查询条件2]})
```

查询条件1与查询条件2只要有一个满足即可
## 查询age为18或者grade为五年级的数据
rows = handler.find({'$or': [{'age': 18}, {'grade': '五年级'}]})
for row in rows:
    print(row)
## 查询 age为100000或者grade为四年级或者grade为五年级的数据

rows = handler.find({'$or': [{'age': 100000}, {'grade': '四年级'}, {'grade': '五年级'}]})
for row in rows:
    print(row)
## 显式与查询

### 隐式与查询

```
collection.find({'name': 'xxx', 'age': 12, 'grade': '五年级'})
```

### 显式与查询

```
collection.find({'$and': [{'name': 'xxx'}, {'age': 12}, {'grade': '五年级'}]})
```

![]()
![读者交流QQ群]()![微信公众号]()


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|37创客科创中心

GMT+8, 2025-12-13 10:05 , Processed in 0.141365 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表