MongoDB 增删改查

只要是数据库那么就绝对离不开最为核心的功能: C U R D ,所以在Mongo 里面对于数据的操作也是有支持的,但是需要提醒的是,除了insert 之外, 其他的都很麻烦

  1. 数据的增加 (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 继续显示 下面 的数据

  2. 数据的查询 (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)  分页
  1. 更新数据 对于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)
      } 
    
相当于每一个数据都拿出来处理,当游标数据取出来之后,时间上每行数据返回的都是一个Object类型的内容, 那么如果需要将数据按照JSON的形式出现,这可以使用printjson() 这个函数
在已知的数据库中之友Mongo 的游标操作是最简单的
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容