mongodb 的基本操作
mongodb的基本操作
mongodb 基础操作
2017/6/18 11:57:38
数据的增删改查
1.数据插入
- 插入文档
db.[documentName].insert({}) - 批量插入文档
db.[docunmentName].insert({},{},{})在shell执行是错误的
for(var i=0;i<=10;i++){
... db.persons.insert({name:i});
... }
在mongo的命令环境带有javescript内置的引擎,可以执行javescript代码
可以使用mongo应用 或在shell中执行for循环
- save操作
save操作与insert操作的区别在于遇到_id相同的情况下
save完成保存操作
inser报错
2.删除数据
- 删除所有的数据
db.docunmenName.remove()
注意本身和索引不会被删除 - 根据条件删除
db.docunmentName.remove({})
删除text中name等于uspactdb.text.remove({name:”uspcat”}) - 小技巧 如果你想清楚一个数据量十分庞大的集合 直接删除该集合并且重新建立索引的办法 比直接用remove的效率和高很多
3.数据更新
- 强硬的文档替换更新
db.docunmentName.update({查询器},{修改器}) - 主键冲突时会报错并停止更新操作
因为是强硬替换当替换的文档和已有文档ID冲突的时候则系统会报错 - inserOrUpdate操作
目的:查询器查出来数据就执行更新操作,查不出来就替换操作(插入操作) 做法:db.[documentName].update({查询器},{修改器},true) - 批量更新操作
默认情况当查询器查询出多条数据的时候默认就修改第一条数据如何实现批量修改
db.[documentName].update({查询器},{修改器},false, true)
第四个参数为true 则实行批量修改
修改器
- $set 它用来指定一个键值对,如果存在键就进行修改不存在则进行添加.
{$set:{field: value}} - $inc 只是使用与数字类型,他可以为指定的键对应的数字类型的数值进行加减操作.
{ $inc : { field : value } } { $inc : { "count" : 1 } } - $unset 他的用法很简单,就是删除指定的键
{ $unset : { “name":1 } -
$push
db.persons.insert({id:5,name:5,books:[]}) db.persons update({id:5,{$push:{books:'js'}}})1.如果指定的键是数组增追加新的数值 2.如果指定的键不是数组则中断当前操作Cannot apply $push/$pushAll modifier to non-array 3.如果不存在指定的键则创建数组类型的键值对 -
$pushAll
-
$addToSet
目标数组存在此项则不操作,不存在此项则加进去 -
$pop 从指定数组删除一个值1删除最后一个数值,-1删除第一个数值
- $pull 删除一个被指定的数值
- $pullAll 一次性删除多个指定的数值
- $ 修改定位器 (通配符)
- $addToSet与$each结合完成批量数组更新
db.text.update({_id:1000},{$addToSet:{books:{$each:[“JS”,”DB”]}}}) - 内存 与效率 当document被创建的时候DB为其分配没存和预留内存当修改操作不超过预留内层的时候则速度非常快反而超过了就要分配新的内存则会消耗时间
-
runCommand函数和findAndModify函数
ps = db.runCommand({ "findAndModify":"persons", "query":{"name":33}, "update":{"$set":{"age":100}}, "new":true })
数据的查询
- 制定返回的的键
db.[documentName].find ({条件},{键指定})
1.1 查询出所有数据的指定键(name ,age ,country)db.persons.find({},{name:1,age:1,country:1,_id:0})默认id是输出的,如果不要id需要 _id:0 -
查询条件
$lt 小于
$lte $gt 大于
$gte
$ne 不等于
2.1查询出年龄在25到27岁之间的学生 db.persons.find({age: {$gte:25,$lte:27},{id:0,age:1}) 2.2查询出所有不是韩国籍的学生的数学成绩 db.persons.find({country:{$ne:” Korea”}},{id:0,m:1}) -
包含不包含 $in或$nin 2.3查询国籍是中国或美国的学生信息 db.persons.find({country:{$in:[“USA”,“China”]}}) 2.4查询国籍不是中国或美国的学生信息 db.persons.find({country:{$nin:[“USA”,“China”]}}) 只能是数组
-
OR查询 $or 2.4查询语文成绩大于85或者英语大于90的学生信息 db.persons.find({$or:[{c:{$gte:85}},{e:{$gte:90}}]},{_id:0,c:1,e:1})
-
Null 把中国国籍的学生上增加新的键sex db.person.update({country:”China”},{$set:{sex:”m”}}) 2.5查询出sex 等于 null的学生 db.persons.find({sex:{$in:[null]}},{country:1})
-
正则查询 2.6查询出名字中存在”li”的学生的信息 db.persons.find({name:/li/i},{_id:0,name:1})
-
$not的使用 $not可以用到任何地方进行取反操作 2.7查询出名字中不存在”li”的学生的信息 db.persons.find({name:{$not:/li/i}},{_id:0,name:1}) $not和$nin的区别是$not可以用在任何地方儿$nin是用到集合上的
- 数组查询$all和index应用 2.8查询喜欢看MONGOD和JS的学生 db.persons.find({books:{$all:[“MONGOBD”,”JS”]}},{books:1,_id:0}) 2.9查询第二本书是JAVA的学习信息 db.persons.find({“books.1”:”JAVA”}) 注意索引数是从0开始的
-
查询指定长度数组$size它不能与比较查询符一起使用(这是弊端) 2.8查询出喜欢的书籍数量是4本的学生 db.persons.find({books:{$size:4}},{_id:0,books:1})
-
查询出喜欢的书籍数量大于3本的学生 1.增加字段size db.persons.update({},{$set:{size:4}},false, true) 2.改变书籍的更新方式,每次增加书籍的时候size增加1 db.persons.update({查询器},{$push:{books:”ORACLE”},$inc:{size:1}}) 3.利用$gt查询 db.persons.find({size:{$gt:3}}) 2.10利用shell查询出Jim喜欢看的书的数量 var persons = db.persons.find({name:"jim"}) while(persons.hasNext()){ obj = persons.next(); print(obj.books.length) } 课间小结 1.mongodb 是NOSQL数据库但是他在文档查询上还是很强大的 2.查询符基本是用到花括号里面的更新符基本是在外面 3.shell是个彻彻底底的JS引擎,但是一些特殊的操作要靠他的 各个驱动包来完成(JAVA,NODE.JS)
-
$slice操作符返回文档中指定数组的内部值 2.11查询出Jim书架中第2~4本书 db.persons.find({name:"jim"},{books:{"$slice":[1,3]}}) 2.12查询出最后一本书 db.persons.find({name:"jim"},{books:{"$slice":-1},_id:0,name:1})
-
文档查询
为jim添加学习简历文档 jim.json
2.13查询出在K上过学的学生
- 这个我们用绝对匹配可以完成,但是有些问题(找找问题?顺序?总要带着score?) db.persons.find({school:{school:"K",score:"A"}},{id:0,school:1}) 2.为了解决顺序的问题我可以用对象”.”的方式定位 db.persons.find({"school.score":"A","school.school":"K"},{id:0,school:1}) 3.这样也问题看例子: db.persons.find({"school.score":"A","school.school":”J”},{_id:0,school:1}) 同样能查出刚才那条数据,原因是score和school会去其他对象对比 4.正确做法单条条件组查询$elemMatch db.persons.find({school:{$elemMatch:{school:"K",score:"A"}}}) 12.$where 12.查询年龄大于22岁,喜欢看C++书,在K学校上过学的学生信息 复杂的查询我们就可以用$where因为他是万能 但是我们要尽量避免少使用它因为他会有性能的代价
db.persons.find({"$where":function(){
//得到查询结果的每一条文档
var books = this.books;
//得到文档中的school对象
var school = this.school;
//如果年纪>=22
if(this.age > 22){
var php = null;
//遍历书籍
for ( var i = 0; i < books.length; i++) {
if(books[i] == "C++"){
php = books[i];
//如果学校是真
if(school){
for (var j = 0; j < school.length; j++) {
//判断是不是在K上学
if(school[j].school == "K"){
//返回是真
return true;
}
}
break;
}
}
}
}
}}
分页排序
- Limit返回指定的数据条数 1.1查询出persons文档中前5条数据 db.persons.find({},{_id:0,name:1}).limit(5)
- Skip返回指定数据的跨度 2.1查询出persons文档中5~10条的数据 db.persons.find({},{_id:0,name:1}).limit(5).skip(5)
- Sort返回按照年龄排序的数据[1,-1] db.persons.find({},{_id:0,name:1,age:1}).sort({age:1}) 注意:mongodb的key可以存不同类型的数据排序就也有优先级 最小值 null 数字 字符串 对象/文档 数组 二进制 对象ID 布尔 日期 时间戳 正则 最大值
游标
利用游标遍历查询数据
var persons = db.persons.find();
while(persons.hasNext()){
obj = persons.next();
print(obj.name)
}

浙公网安备 33010602011771号