【MongoDB】03 文档CRUD
文档CRUD操作
文档类似于MySql中的row,表示一行数据。
MongoDB中文档的数据结构和JSON基本一样,是一种叫BSON的格式。
单个文档数据插入:
插入方法使用 insert() 或者 save() 或者 insertOne() 方法
语法:
db.集合名.insert(BSON格式文档内容)
或者
db.集合名.save(BSON格式文档内容)
或者
db.集合名.insertOne(BSON格式文档内容)
两个区别:
save():
如果 _id 主键存在则更新数据,如果不存在就插入数据。
该方法新版本中已废弃,可以使用
db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
insert():
若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,
提示主键重复,不保存当前数据。
演示插入
db.user.insert({name:"aaa",age:22,password:"123456"})
WriteResult({ "nInserted" : 1 })
但是好像并不允许输入中文
批量插入:
db.集合名.insertMany(
[文档1, 文档2...],
{
ordered: 指定MongoDB是否有序插入。可选值
}
)
注意:
MongoDB的批量插入并不是同时成功或者同时失败。如果在插入过程中有一条数据失败,就会终止插入,但是在此之前的数据都会插入成功。
插入数据较多的情况下可能会报错,可以在命令前后使用try catch进行异常捕捉
try {
db.集合名.insertMany()
} catch(e) {
print(e)
}
更新文档:
db.集合名.update(
{BSON格式查询条件},
{BSON格式要更新的内容},
{
upsert: 布尔类型,指定如果不存在update的记录,是否插入。默认false
multi: 默认false,只更新找到的第一条记录。如果为true,则更新查询条件下的所有记录
}
)
覆盖修改
修改用户编号是1的数据,姓名修改为 李四
db.user.update(
{_id: "1"},
{name, "李四"}
)
修改完成后发现这条文档只剩下name字段了,其他字段被覆盖掉了,因此实际使用不可以这么写。
局部修改
修改数据时,建议使用修改器 $set 来实现。还是上面那条需求。
db.user.update(
{_id: "1"},
{$set: {name: "李四"}}
)
修改成功,其他字段依然存在
批量修改
更新所有年龄是18岁的用户,年龄更新为19
db.user.update(
{age: NumberInt(18)},
{$set: {age: NumberInt(19)}},
{multi: true}
)
如果不加multi参数,只会更新符合条件的一条数据
列值自增
如果想要 对某列的值进行自增操作,可以使用 $inc
db.集合名.update(
{_id: "1"},
{$inc: {age: NumberInt(1)}}
)
文档删除
db.集合名称.remove(BSON格式条件)
#下面的语句会删除所有数据,慎用
db.集合名称.remove({})
查询文档
查询使用 find() 或者 findOne() 方法进行
注意:
find() 方法会查询出所有符合要求的数据
findOne() 方法只会查询出第一条符合要求的数据
语法:
db.集合名.find(BSON格式条件).pretty()
pretty是可选项。功能是格式化输出查询结果。
例如我要查询编号是1的用户
db.user.find({_id: "1"})
查询条件:
| 操作 | 格式 | 范例 | MySQL中类似语句 |
|---|---|---|---|
| 等于 | {key, value} | db.user.find({_id: 1}) | where id = 1 |
| 小于 | {key, {$lt: value} | db.user.find({age: {$lt: 18}}) | where age < 18 |
| 小于等于 | {key, {$lte: value}} | db.user.find({age: {$lte: 18}}) | where age <= 18 |
| 大于 | {key, {$gt: value}} | db.user.find({age: {$gt: 18}}) | where age > 18 |
| 大于等于 | {key, {$gte: value}} | db.user.find({age: {$gte: 18}}) | where age >= 18 |
| 不等于 | {key, {$ne: value}} | db.user.find({age: {$ne: 18}}) | where age != 18 |
| 包含 | {key, /value/} | db.user.find(name: /俊/) | where name like '%俊%' |
| 以...开头 | {key, /^value/} | db.user.find(name: /^雷/) | where name like '雷%' |
| 以...结尾 | {key, /value$/} | db.user.find(name: /华$/) | where name like '%华' |
| 在...之中 | {key, {$in: [value1, value2...]}} | db.user.find(age: {$in: [1,2,3]}) | where age in (1,2,3) |
| 不在...之中 | {key, {$nin: [value1, value2...]}} | db.user.find(age: {$nin: [1,2,3]}) | where age not in (1,2,3) |
| 类型为... | {key: {$type: "string"}} | db.user.find(age: {$type: 'string'}) | 无。查询用户集合中age是String类型的数据 |
其中,/value/ 事实上是正则表达式查询。语法和JS中的正则一模一样。
多条件查询:
find() 方法可以传入多个键值对,类似于SQL的AND条件
如,查询性别是男,年龄在18岁的用户
db.user.find({sex: "1", age: "18"})
OR 条件
MongoDB提供了关键字 $or 用来实现or查询
语法:
db.集合名.find({$or: [{key1, value1}, {key2, value2}]})
如,查询年龄是17或者19的用户
db.user.find({$or: [{age: 17}, {age: 19}]})
AND 和 OR 联合使用
如,查询性别是男,并且年龄是17或者19的用户
db.user.find({sex: "1", $or: [{age: 17}, {age: 19}]})
统计查询
语法
db.集合名.count(BSON格式条件)
统计所有性别为男的数据
db.user.count({age: "1"})
分页查询
使用 limit 读取指定数量的数据,
skip 跳过指定数量的数据,
二者搭配来进行分页查询。使用逻辑和MySql中的limit一样。
查询返回前三条记录,limit参数默认是20
db.集合.find().limit(3)
跳过前3条记录,skip参数默认是0
db.集合.find().skip(3)
每页查询2条数据
db.集合.find().skip(0).limit(2)
db.集合.find().skip(2).limit(2)
db.集合.find().skip(3).limit(2)
排序查询
排序查询使用 sort 方法。sort方法可以指定排序的字段,值为1升序,值为-1降序
根据性别升序排序,并根据年龄降序排序
db.user.find().sort({sex: 1, age: -1})
再进行分页,每页20条
db.user.find().sort({sex: 1, age: -1}).skip(0).limit(20)

浙公网安备 33010602011771号