mongoDB的高级查询和高级修改

    Mongodb,分布式文档存储数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发。

    MongoDB是一个基于分布式文件存储的数据库。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。
    Mongo最大的特点是支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
    MongoDB服务端可运行在Linux、Windows或Mac平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

   热身:

    show dbs 显示所有的数据库
    exit 退出
    db 当前数据库
    show tables  /  show collections  当前数据库有多少张表(集合)
    db.c1.insert({name:"user1"});   插入一条数据
    db.c1.save({name:"user1"});    插入一条数据
    两者区别:
    如果要插入的_id相同,save可以操作,_id相同则更改,不同则插入。


但是insert会报错:


db.c1.find();    查询c1表中所有数据
db.c1.find("条件");  查询符合该条件的所有记录
db.c1.findOne();   只查询第一条记录
db.c1.findOne("条件");   只查询符合该条件的第一条记录
进入data目录下查看:


db.c1.remove();    删除c1集合中所有的数据
db.c1.remove("条件");    删除c1集合中符合条件的所有的数据
修改数据把user3修改成user30:
若已经插入db.c1.insert({name:"user3",age:30});
{ "_id" : ObjectId("54cc83821e766bd0fad100e2"), "name" : "user3", "age" : 30 }
db.c1.update({name:"user3"},{name:"user30"});  
但是修改后的记录是:
{ "_id" : ObjectId("54cc83821e766bd0fad100e2"), "name" : "user30" }
少掉了age:30
若不丢失其他json数据,则这样进行修改即可:
db.c1.update({name:"user3"},{$set:{name:"user300"}});   //和删除一样,第一个参数里面是条件匹配
若要增加json数据,则这样进行修改即可:
db.c1.update({name:"user300"},{$set:{sex:"boy"}});
{ "_id" : ObjectId("54cc83821e766bd0fad100e2"), "age" : 30, "name" : "user300", "sex" : "boy" }
子json插入:
db.c1.insert({name:"user1",post:{title:1,content:"hello"}});
子数组插入:
db.c1.insert({name:"user2",post:[1,2,3,4,5]});
{ "_id" : ObjectId("54cc8efabe9bf76a3494b725"), "name" : "user1", "post" : { "title" : 1, "content" : "hello" } }
{ "_id" : ObjectId("54cc8f98be9bf76a3494b726"), "name" : "user2", "post" : [ 1, 2, 3, 4, 5 ] }
写个循环语句进行插入:


如果只要查询某一条记录的某一列,需要设置find的第二个参数即可,如设置name:1,表示只显示name这一列:
 db.c1.find({name:"user11"});
{ "_id" : ObjectId("54cc937428be09ca6a8023ba"), "name" : "user11", "age" : 20, "sex" : "boy" }
 db.c1.find({name:"user11"},{name:1});
{ "_id" : ObjectId("54cc937428be09ca6a8023ba"), "name" : "user11" }
db.c1.find({name:"user11"},{name:1,age:1});
{ "_id" : ObjectId("54cc937428be09ca6a8023ba"), "name" : "user11", "age" : 20 }


如果不想带上_id, _id:0.
db.c1.find({name:"user11"},{name:1,age:1,_id:0});
{ "name" : "user11", "age" : 20 }


一、高级查询

1)条件>,>=,<,<=,=
db.c1.find({age:{$gt:5}});  //查询年龄大于5的
db.c1.find({age:{$lt:5}});   //查询年龄小于5的
db.c1.find({age:{$gte:5}});//查询年龄大于等于5的
db.c1.find({age:{$lte:5}});//查询年龄小于等于5的
db.c1.find({age:{$ne:5}});//查询年龄不等于5的

db.c1.find({age:{$gt:5}}).limit(3);  //查询年龄大于5的,前3个记录。
db.c1.count();    db.c1.find().count(); //查询表c1有多少条记录

db.c1.find().sort({age:1});  //升序


db.c1.find().sort({age:-1});  //降序


db.c1.find().skip(5).limit(5);  //跳过5个,查询5个
db.c1.find().skip(1).limit(5);  //跳过1个,查询5个


db.c1.find().skip(7).limit(2).sort({age:-1});  //跳过1个,查询5个(这里是排序后再跳过多少条数据执行)


db.c1.find().skip(7).limit(2).sort({age:-1}).count(0); 
结果是:10
db.c1.find().skip(7).limit(2).sort({age:-1}).count(1); 
结果是:2


2)
$all操作类似$in操作,但是不同的是,$all操作要求数组里面的值全部被包含在返回的记录里面。


3)
$exists操作检查一个字段是否存在,如:


4)
$mod操作可以让我们简单的进行取模操作,而不需要用到where子句。


5)
$in操作类似于传统关系数据库中的in


6)
$nin跟in操作相反


7)
$nor跟$or相反(可以有多个字段参与)



8)
$or(可以有多个字段参与)



9)
$size操作将会查询数组长度等于输入输入参数的数组


10)正则表达式

11)distinct


12)$elemMatch


13)Cursors游标及Cursors Methods
遍历游标


14)null


解决方式1:
exists:(过滤未定义的age)


exists+in:(过滤未定义的age并且为null的age)


解决方式2:


15)slice
查询第一篇帖子,前两篇帖子,前三篇帖子


查询倒数第一篇帖子,倒数后两篇帖子

查询skip:1,limit:2



二、高就修改

1)语法
db.collection.update(criteria,objNew,upsert,multi)  //后两个参数默认为:0,0
参数说明:
criteria:用于设置查询条件的对象
objNew:用于设置更新内容的对象
upsert:如果记录已经存在:更新它,否则新增一个记录
multi:如果有多个符合条件的记录,全部更新
注意:默认情况下,只会更新第一个符合条件的记录



必须是$set才可以


2)save()
// 如果存在更新它,如果不存在,新增记录
3)$set
语法:
{$set:{field:value}}
功能: 把field的值设置成value,当field不存在时,增加一个字段,value支持所有类型。
4)常用操作:
$inc
语法:{$inc:{field:value}}
功能:把field的值加一个value


也可以减去一个数:


$unset
语法:{$unset:{field:1}}
功能:
删除给定的字段field。


$push
语法:{$push:{field:value}}
功能:
如果field是一个已经存在的数组,那么把value追加给field;
如果原来不存在,那么新增field字段,把value的值赋给field;
如果field存在,但不是一个数组,将会报错。

push子数组:


$pop
语法:{$pop:{field:1}}
功能:删除数组中的最后一个元素
语法:{$pop:{field:-1}}
功能:删除数组中的第一个元素


$pushAll
语法:{$pushAll:{field:value}}
功能:同push,只是这里的value是数组,相当于对数组里的每一个值进行push操作。


5)
$addToSet
语法:{$addToSet:{field:value}}
功能:如果field是一个已经存在的数组,并且value不在其中,那么把value加入到数组;
如果field不存在,那么把value当成一个数组形式赋给field;
如果field是一个已经存在的非数组类型,那么将会报错。


$addToSet配合$each使用


$pull
语法:{$pull:{field:_value}}
功能:
如果field是一个数组,那么删除符合_value检索条件的记录;
如果field是一个已经存在的非数组,那么会报错。


$pullAll
语法:{$pullAll:{field:value_array}}
功能:同push类似,只是value的数据类型是一个数组。


$rename
语法:{$rename:{old_field_name:new_field_name}}
功能:重命名指定的字段名称,从1.7.2版本后开始支持


6)
特殊操作符:$
$操作符代表查询记录中第一个匹配条件的记录项




7)
find得到的x是一个有游标的
findOne得到的x相对于一个json对象


通过x(findOne)增加一些属性,接着用save(x)保存:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值