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()的范围查询
我们经常需要查询某些值在一个特定范围内的文档
//查询年龄介于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()的正则表达式查询
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()默认情况下会使新对象替换旧对象
- 如果要修改指定属性,而不是替换,需要使用“修改操作符”来完成修改:
- $set:可以用来修改文档中指定属性
- $unset:删除文档指定属性
- $ i n c : 修 改 数 值 , 做 加 法 运 算 , 直 接 inc:修改数值,做加法运算,直接 inc:修改数值,做加法运算,直接inc操作符,可以是正数、负数,也可以是小数
- $ m u l : 修 改 数 值 , 做 乘 法 运 算 , 直 接 mul:修改数值,做乘法运算,直接 mul:修改数值,做乘法运算,直接mul操作符,可以是正数、负数,也可以是小数
- $rename:修改错误字段的键名,尤其在键名大量出错时
- $max:当前值大于指定值时,修改为指定值
- $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”)}})
//修改复杂文档
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();