MongoDB:增删查改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0f3IpcXc-1608263133250)(F:\JianShu_material\NoSQL\MongoDB\图片\增删查改\增删查改.png)]

1. 插入文档

1.1 db.collection.insert()

insert()的参数说明:

  • 必填字段:< document or array of documents >,要插入的数据
  • 选填字段
    • ordered: < boolean >,默认为true,是按数组中文档的先后顺序插入(而非必须明确指定id,且按文档id的先后顺序插入),如果某条文档插入失败(如:id与原有文档重复等等),就停止其后剩余文档的插入。如果false,执行无序插入,如果错误发生在某个文档中,则继续处理数组中的剩余文档
    • writeConcern:< document >

insert()解释说明:

  • 向集合中插入一个或多个文档可以使用insert()
  • 插入多个文档时用数组插入
  • 当我们向集合中插入文档时,如果没有给文档指定_id属性,则数据集合会自动问文档添加 _id,该属性来作为文档的唯一标识
  • _id也可以自己指定,则数据库不会为我们添加,但也要注意唯一性
//插入一条简单文档
db.stus.insert({name:"猪八戒",age:28,gender:"男"});

//插入一条复杂文档
db.goodsbaseinf.insert(
 {name:"<c语言>",
 bookprice:33.2,
 adddate:2017-10-1,
 allow:true,
 baseinf:{ISBN:183838388,press:"清华大学出版社"},
 tags:["good","book","it","Program"]
 })

//有序批量插入多个文档
db.stus.insert([
    {name:"孙悟空",age:128,gender:"男"},
    {name:"沙和尚",age:38,gender:"男"},
    {name:"白骨精",age:18,gender:"女"}
    ]
    {ordered:true}
);

//用变量方式插入文档
document=({name:"《C语言编程》",price:32})//document为变量名
db.goodsbaseinf.insert(document)

1.2 insertOne()、insertMany()和save()

  • db.collection.insertOne()只能用来插入一个文档对象
  • db.collection.insertMany()只能用来插入多个文档对象
  • 二者其余用法与inset()相同,好处是可以直观地看出插入了几个文档对象
  • insert命令可以用save命令代替。不同于insert操作之处在于,插入文档的_id与现有文档的_id相同时:save用新文档替代原有同id的文档,insert则会报错

2. 查询文档

2.1 db.collection.find()

find()参数说明:

  • 必选参数
    • < query >,查询条件设置:查询选择器
    • < projection >,指定需要返回的字段:投影

find()解释说明:

  • find()用来查询集合中所有符合条件的文档
  • 如果()中为空或为({}),则说明无条件,意思为查询所有符合条件的文档
  • {属性:值}查询属性是指定值的文档,可以传多个条件,用逗号隔开
  • find返回的是一个数组,可以find()[0]
/* 查询所有文档*/
db.stus.find({});

/* 查询age为128的文档*/
db.stus.find({age:128});

/* 查询age为128,name为孙悟空的文档*/
db.stus.find({age:128,name:"孙悟空"});

/* 返回结果为数组*/
db.stus.find()[0];

/* find().count()或find().length(),返回查询的数量*/
db.stus.find().count();
db.stus.find().length();

db.goodsbaseinf.find().limit(1) //返回第一条文档
db.goodsbaseinf.find().skip(2) //显示第三条开始的文档记录

find()有多种查询选择器,用来匹配查询对象:

  • 选择器匹配
  • 范围查询
  • 匹配数组
  • 布尔操作符
  • 正则表达式
  • where操作符

2.2 find()的选择器匹配

//语法:db.col.find({<key1,value>,{key2:value>,...})
//无论传入多少个键值对,他们必须全部匹配;查询条件之间相当于运用了布尔运算符and
db.user.find({last_name:"Banker"})
db.user.find({first_name:"Smith",age:40})

2.3 find()的范围查询

我们经常需要查询某些值在一个特定范围内的文档

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jA2DLjn-1608263133256)(F:\JianShu_material\NoSQL\MongoDB\图片\增删查改\007.png)]

//查询年龄介于25到30之间的人
db.persons.find({age:{$gte:25,$lte:30}})

2.4 find()的匹配数组

//若与任一搜索键匹配时,$in就该返回该文档。常用于ID列表
//案例:查询国籍是中国或美国的学生信息
db.persons.find({country:{$in:["USA","China"]}})

//若与任一搜索键不匹配时,$nin才返回文档
//案例:查询国籍不是中国或美国的学生信息
db.persons.find({country:{$nin:["USA","China"]}})

//若文档中的数组值至少一个元素满足所有匹配条件,$elemMatch会返回文档
//案例:假设scores集合有以下文档:{ _id: 1, results: [ 82, 85, 88 ] } { _id: 2, results: [ 75, 88, 89 ] }。查询80<=results<=85的文档
db.scores.find({results:{$elemMatch:{$gte:80,$lt:85}}})

//$all(匹配数组):与所有搜索键匹配,返回文档
//案例:查询喜欢看MONGOD和JS的学生 
db.persons.find({books:{$all:["MONGODB","JS"]}})

//index应用
//案例:查询第二本书是JAVA的学习信息
db.persons.find({"books.1":"JAVA"})

//$size(匹配数组):查询指定长度数组,它不能与比较查询符一起使用(这是弊端)
//案例:查询出书籍数量是4本的学生
db.persons.find({books:{$size:4}})

2.5 find()的布尔查询

//$ne表示不等于,可以作用于单个值和数组
//案例:查询出所有国籍不是韩国籍的学生
db.persons.find({country:{$ne:"Korea"}})

//$not对查询结果求反,但不能放于外层文档。注意:后面必须跟正则表达式或者文档
//案例:查询出姓名里不含"li"的学生
db.persons.find({name:{$not:/li/i}})

//$or表示逻辑或关系
//案例:查询语文成绩大于85或者英语大于90的学生信息
db.persons.find({$or:[{c:{$gte:85}},{e:{$gte:90}}]})

//$or与$in
//案例:查询国籍为中国或美国的学生
db.persons.find({$or:[{country:"China"},{country:"Korea"}]})
db.persons.find({country:{$in:["China”,”Korea"]}})

//$and主要用于连接具有and关系的复杂查询条件

//$exists用于查询集合中是否包含特定键的文档
db.persons.find({gender:{$exists:true}}) //返回键名含有gender的文档
db.persons.find({gender:{$exists:false}}) //返回键名不含有gender的文档

2.6 find()的正则表达式查询

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gn1qiDZz-1608263133261)(F:\JianShu_material\NoSQL\MongoDB\图片\增删查改\002.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nY2feSMD-1608263133268)(F:\JianShu_material\NoSQL\MongoDB\图片\增删查改\003.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MOgBJoRR-1608263133271)(F:\JianShu_material\NoSQL\MongoDB\图片\增删查改\004.png)]

3. 更新文档

3.1 db.collection.update()

update()参数说明:

  • 必选参数
    • < query >,update的查询条件
    • < update >,更新对象文档,含操作符功能使用
  • 可选参数
    • upsert:< boolean >,如果不存在update的记录,是否插入,true为插入,默认是false,不插入
    • multi:< boolean >,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
    • writeConcern:< document >
    • collation:< document >

update解释说明:

  • update(查询条件,新对象)
  • update()默认情况下会使新对象替换旧对象
  • 如果要修改指定属性,而不是替换,需要使用“修改操作符”来完成修改:
    1. $set:可以用来修改文档中指定属性
    2. $unset:删除文档指定属性
    3. $ i n c : 修 改 数 值 , 做 加 法 运 算 , 直 接 inc:修改数值,做加法运算,直接 incinc操作符,可以是正数、负数,也可以是小数
    4. $ m u l : 修 改 数 值 , 做 乘 法 运 算 , 直 接 mul:修改数值,做乘法运算,直接 mulmul操作符,可以是正数、负数,也可以是小数
    5. $rename:修改错误字段的键名,尤其在键名大量出错时
    6. $max:当前值大于指定值时,修改为指定值
    7. $min:当前值小于指定值时,修改为指定值
//默认情况下替换,将沙和尚的所有信息换为age:28
db.stus.update({name:"沙和尚"},{age:28});

//先插入一个文档
db.order.insert(
{_id:10
titless:"商品购物单1",
amount:35,
unit:"元",
detail:[{name:"苹果",price:22},{name:"面粉",price:18}],
lastname:ISODate(2017-16-30 12:05:06)
})

db.order.update({titless:"商品购物单1"}{$set:{titless:"商品购物单2"}})
db.order.update({titless:"商品购物单2"}{$inc:{amount:5}})
db.order.update({titless:"商品购物单2"}{$mul:{amount:5}})
db.order.update({_id:10},{$rename{"titless","title"}})
db.order.update({_id:10},{$unset:{unit:"元"}})
db.order.update({_id:10}{$min:{amount:50}})
db.order.update({_id:10}{$max:{amount:50.5}})

//Date():显示当前的时间
//new Date  构建一个格林尼治时间,可以看到正好和Date()相差8小时,我们是+8时区,也就是时差相差8,所以+8小时就是系统当前时间
//ISODate():也是格林尼治时间
db.order.update({_id:10}{$set:{lastname:ISODate(2018-16-30 12:05:06)}})

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YsK0n4CA-1608263133274)(F:\JianShu_material\NoSQL\MongoDB\图片\增删查改\005.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GsNnThio-1608263133276)(F:\JianShu_material\NoSQL\MongoDB\图片\增删查改\006.png)]

//修改复杂文档
db.order.insert(
{_id:12
title:"商品购物单5",
amount:60,
unit:”元”
detail:[{name:"苹果",price:22},{name:"面粉",price:18}]
lastname:ISODate{2017-16-30 12::05:06}
overview:{shop:”丁丁商务平台”,address:”地球村”}
}
)

//修改一条文档里的数组或嵌套文档
//数组修改通过Key.Number指定待修改数组值(数组下标从0开始)
//子文档修改通过Key.SubKey指定待修改字段
db.order.update({_id:2},
         $set:{"detail.1":{name:"大米",price:40},
               "overview.address":"天津市和平区成都道9号"}})
db.order.update({_id:2},{$set:{"detail.1.name":"大米"}})

3.2 updateOne()、updateMany()和replaceOne()

  • updateMany()同时修改多个符号条件的文档
  • updateOne()只能修改一个符合条件的文档
  • replaceOne()替换一个文档,参数中不能出现类似$inc等更新操作符

4. 删除文档

4.1 db.collection.remove()

remove()参数说明:

  • 必选参数:< query >,设置删除文档条件
  • 可选参数
    • justOne:< boolean >,false为默认值,删除符合条件的所有文档;true删除符合条件的一条文档
    • writeConcern:< document >,自定义写出错确认级别
    • collation:< document >,指定特定国家语言的删除归类规则

remove()解释说明:

  • 可以根据条件来删除文档,传递条件的方式和find()一样
  • 默认删除符号条件的所有文档, 但传入第二个参数为true则可删除一个
  • 若传递参数为({}),则删除集合中全部文档
//删除name为沙和尚的文档
db.stus.remove({name:"沙和尚"});
//删除name为沙和尚和猪八戒的多个文档
db.stus.remove({name:"沙和尚",name:"白骨精"});
//删除符合条件的所有文档记录
db.collection_name.remove({price:{$gt:3}});
//删除符合条件的单个文档记录
db.collection_name.remove({price:{$gt:3}},{justOne:true});
//删除所有文档
db.stus.remove({});
db.stus.drop();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值