【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)

 

posted @ 2020-09-11 11:11  emdzz  阅读(191)  评论(0)    收藏  举报