只要是数据库那么就绝对离不开最为核心的功能: C U R D ,所以在Mongo 里面对于数据的操作也是有支持的,但是需要提醒的是,除了insert 之外, 其他的都很麻烦
-
数据的增加 (insert)
使用 db. 集合 .insert({"url":"www.baidu.com"}}) 实现增加数据保存数据
var arr = [{"url":'baidu.com'},{"url":'zhihu.com'}]
db.集合.insert(arr)保存大数据 配合javascript 代码
for(var a = 0; a< 10000; a++){
db.demo.insert({"str":"test-"+a})
}
数据很多的时候 在列表时 不会全部列出, 只会列出部分 我的是只显示16条 it 继续显示 下面 的数据 -
数据的查询 (find)
任何数据库中,数据的查询操作都是最为麻烦的,而在Mongo 中对于查询的支持非常到位,包含有 关系运算, 逻辑运算 , 数组运算, 正则运算
首先对于数据的查询的核心语法 db.集合.find({查询条件}})
db.demo.find({"url":"baidu.com"}) (以JSON格式查询)
对于设置显示字段 严格来说就是数据的投影操作
不想显示_id : db.demo.find({"url":"baidu.com"},{"_id":0})
查询出来的数据 格式化 函数 db.demo.find().pretty()
2.1 关系查询
大于($gt)
大于等于($gte)
小于($lt)
小于等于($lte)
不等于($ne)
为了演示 创建多个数据
var json = [
{"name":"tom","age":20,"sex":"男","score":100,"address":"南京市江宁区"},
{"name":"tom1","age":21,"sex":"女","score":90,"address":"南京市江宁区"},
{"name":"tom2","age":21,"sex":"女","score":80,"address":"南京市江宁区"},
{"name":"tom3","age":20,"sex":"男","score":70,"address":"南京市江宁区"},
{"name":"tom4","age":23,"sex":"男","score":100,"address":"南京市江宁区"}
]
db.infos.insert(json)
问题1: 查询名字 为tom 的数据 这个就不用写了吧
问题2: 查询age > 20 的数据
db.demo.find({"age":{"$gt":20}}).pretty()
问题3: 查询score != 100 的数据
db.demo.find({"score":{"$ne":100}}).pretty()
注意: 这些都不是很难 但是一定要记住 嵌套的json 格式2.2 逻辑运算 逻辑运算 主要就三种类型 逻辑与($and) 逻辑或($or) 逻辑非($not, $nor) 问题1 :查询 age >19 ~ age<20 的数据 db.infos.find({"age":{"$gt":19,"$lt":21}}).pretty() and连接是最简单的 问题2: 查age < 21 或者 score > 80 的数据 db.infos.find({"$or":[{"age":{"$lt":21}},{"score":{"$gt":80}}]}).pretty() 问题2 求反 db.infos.find({"$nor":[{"age":{"$lt":21}},{"score":{"$gt":80}}]}).pretty() 注意: 其实就是 $or 改成了 $nor 就是求反 2.3:求模 语法: db.infos.find({"age":{"$mod":[20,0]}}).pretty() %20 == 0 的数据 2.4 范围查询 只要是数据库,必须存在 $in 在范围之间 和 $nin 不在范围之间 db.infos.find({"name":{"$in":["tom","tom1","tom2"]}}).pretty() 不在范围之间 就不写了, 吧 $in 换成$nin 就是不在范围之间
2.5 数组查询
创建数据
var arr = [
{"name":"tom","age":20,"sex":"男","score":100,"address":"南京市江宁区",
"course": ["语文","数学","英语"]},
{"name":"tom1","age":21,"sex":"女","score":90,"address":"南京市江宁区",
"course": ["语文","政治","英语"]},
{"name":"tom2","age":21,"sex":"女","score":80,"address":"南京市江宁区",
"course":["语文","数学"]},
{"name":"tom3","age":20,"sex":"男","score":70,"address":"南京市江宁区",
"course":["语文","英语"]},
{"name":"tom4","age":23,"sex":"男","score":100,"address":"南京市江宁区",
"course":["语文","计算机"]}
]
db.infos.insert(arr)
$all $size $slice $elemMatch
查询同时包含 语文 和 数学 课程的 数据
db.infos.find({"course":{"$all":["语文","数学"]}},{"_id":0})
也可以查询一个数据
db.infos.find({"address":{"$all":["南京市江宁区"]}})
也可以使用数组的索引来查询
db.infos.find({"course.1":"数学"})
$size
查询course 长度为2的数据
db.infos.find({"course":{"$size":2}})$slice 上面查询的时候 你会发现 你匹配的数据 全部都出来了, 明明匹配的是2个 返回age 为 21的数据, 只取 course 前2个 db.infos.find({"age":21},{"course":{"$slice":2}}) 后2个db.infos.find({"age":21},{"course":{"$slice":-2}}) 只返回2个 db.infos.find({"age":21},{"course":{"$slice":[1,2]}}) $slice["跳过1个","取后面2个"] 2.6 嵌套集合运算 $elemMatch 查询出父母是会计的数据 db.infos.find({"$and":[{"age":20},{"parents":{"$elemMatch":{"job":"会计"}}}]}).pretty() 这种查询条件比较麻烦,很容易出错 如果可以的话 经量别搞这么复杂的数据结构 2.7 判断某个字段是否存在的数据 $exists db.infos.find({"course":{"$exists":false}}) 2.8 条件过滤查询 $where 查询age 大于 20的 db.infos.find({"$where":"this.age>20"}}) 简写 : db.infos.find("this.age> 20") 注意: 不建议: 本身 find("age":20) 是在用索引 操作数据 如果使用了$where 之后 将放弃 索引 使用遍历的方式 查询 2.9 正则运算 如果想要实现模糊查询,那么必须使用正则表达式,而且正则表达式使用的是 Perl 兼容的正则表达式的形式 基础语法: {key : 正则标记} 完整语法: {key:{"$regex": 正则标记, "$options":选项}} $options 的选项有 " i " : 忽略大小写 " m ": 多行查找 " x ": 空白字符除了被转义的 完全忽略 " s ": 匹配所有字符,包括换行内容 查询 地址中包含 江宁区的 地址 db.infos.find({"address":/江宁区/}) 注意正则中不加双引号 db.infos.find({name:/JS/i}) 完整版 db.infos.find({name:{"$regex":/JS/i}})
2.10 数据排序 sort ( ) 升序 和 降序
db.infos.find().sort({_id: 1})
最然排序 $natural
2.11 数据分页
skip(n): 表示跨过多少数据行
limit(n): 去除数据行的个数限制
db.infos.find().skip(0).limit(5) 分页
-
更新数据 对于Mongo 而言,数据的更新基本上是一件很麻烦的事情
save() update()
如果要修改数据最直接的 就是使用函数 update()
语法: db.集合.update(条件,新的对象数据,upsert, multi)
upsert 如果更新的数据不存在 则增加一条新的内容(true 是增加 false 不增加)
multi 表示 是否只更新满足条件的第一行记录, ( true 全部更新 false 只更新第一个)
问题: 将age === 20 的人的成绩都更新成100
db.infos.update({age:20},{"$set":{score : 100}},false,false)
将age===30 的人 的成绩更新成 101 (age === 30 的人不存在)
db.infos.update({age:30},{"$set":{score : 101}},true,false)save() 操作 (乱 我也搞不清楚.. 现在依然很乱)
db.infos.save({"_id" : ObjectId("599ef3cad3305c2e619d8227")})
注意: 你保存什么样 数据就是什么样, 前面是条件3.1 修改器
对于MongoDB数据库而言.数据的修改会牵扯到内容的变更,节后的变更,(包含数组),所以在进行mongodb 设计的时候就提供有一系列的修改器的应用,那么像之前使用的$ set 就是一个修改器1. $inc : 主要针对于一个数字字段,增加某个数字字段的数据内容 语法: {" $inc ":{" 成员 " : 内容}} 将age : 20 的数据 的 score 减少 30 db.infos.update({"age":20},{"$inc":{"score":-10}},false.true) 2.$set : 进行内容的重新设置 语法: {" $set " : {"成员": " 新内容 "} } db.infos.update({name:'jsbin'},{"$set":{"sex":"人妖"}},false,true) 3.$unset : 删除某个成员的内容 语法: {"$unset" : { " 成员 ": 1}} db.infos.update({name:'jsbin'},{"$unset":{sex:1}},false,true) 4.$push : 将内容追加到指定的成员之中, 基本上是数组 语法: {" $push " : { 成员: value}} 就是进行数组添加操作使用时的 db.infos.update({name:"tom"},{"$push":{"course":"美术"}},false,true) 5 .$pushAll: 与 $push 是类似的,可以一次追缴多个内容到数组里面 db.infos.update({url:"javascript.com"},{"$pushAll":{"class":["美术","胡指令"]}}) 注意: ( 要更新的字段必须是一个数组 ) 6.$addToSet : 向数组里面增加一个新的内容.之友这个内容不存在的时候 才会增加 语法: {" $addToSet ": {成员: 内容}} db.infos.update({url:'javascript.com'},{"$addToSet":{class:'王五'}}) 注意: ( 如果被添加的字段里面存在 王五 则不添加 ) 7.$pop : 删除数组内的数据 语法: {" $pop ": {成员 : 内容}} 内容为 -1 正向删除第一个,内容为1 逆向删除第一个 db.infos.update({url:'javascript.com'},{"$pop":{class: 1}}) 8.$pull : 从数组中删除指定的数据 语法: {"$pull" : { 成员: 内容}} db.infos.update({url:'javascript.com'},{"$pull":{class:"胡指令"}}) 注意: 如果被删除字段没有这个数据 则不修改 9 .$pullAll : 一次性删除多个内容 语法: {"$pullAll" : { 成员: [ ' 数据 ',' 数据 ']}} .infos.update({"_id" : ObjectId("599ec0e62c5396484f5f9537")},{"$pullAll":{"course":["语文","数学"]}}) 10 .$rename : 为成员名称重命名 语法: {" $rename ": {旧的name : 新的name}} db.infos.update({url:'javascript.com'},{"$rename":{class:'班级'}})
删除数据
在Mongo 里面数据的删除实际上并不复杂,只需要使用 remove ()但是在这个函数 是有2个可选项的
删除条件 : 满足条件的数据被删除
-
是否只删除一个数据,如果设置为 true 或者 1 表示只删除一个数据
db.demo.remove({}) 删除这个集合中的所有数据 db.demo. drop () 删除这个集合 show tables 查看这个数据库中还有几个集合 删除所有姓名里面带有 js 的数据 ( 默认情况下是全部删除 ) db.infos.remove({'name':/js/i}) 删除姓名带有tom 的数据,要求只删除一个 ( 1 or true 都表示只删除一个 ) db.infos.remove({"name":/tom/i},1)
游标 (什么叫游标 ( 重点 ))
所谓的游标就是指的数据可以一行行的进行操作,非常类似于ResultSet 数据处理.在Mongo里面 对于游标的控制非常的件i暗淡,只需要使用find ()函数就可以返回游标了.对于返回的游标如果想要进行操作,使用2个函数
判断是否有下一个数据: hasNext()
-
取出当前数据 next ()
var result = db. infos. find() result. hasNext() result.next() 注意: 以上是游标的操作形式, 但是实际上不可能这么去用,必须利用循环才能输出内容 var corsor = db.infos.find() 注意: 这里使用while 使用if 则只能取出一条数据. 原因 我还未知 while(corsor.hasNext()){ var doc = corsor.next() print(doc.name) }