频道栏目
首页 > 资讯 > DB2 > 正文

mongodb笔记——查询

17-07-11        来源:[db:作者]  
收藏   我要投稿

mongodb笔记——查询,以下举例操作集合为以下格式。

student集合(不要太在意这表的设计,只是为方便举例而已)

_id name age sex score books
123 张三 20 man [{name:"语文",score:90},{name:"英语",score:90},{name:"数学",score:90}] ["java","OC","js","mongodb"]

1、普通查询

mongodb使用的是bson,使用上跟jison几乎无异,在使用查询上基本跟操作对象差不多 (1)查所有数据
db.student.find()

(2)只查询指定的字段
db.student.find({},{name:1})

db.student.find({},{name:0})


上面例子中第一个{}为条件,第二个为要查询的字段0为不现实,1为显示。 第一条查询结果只显示_id和name,如要_id也不显示则需要指明_id不显示(即{name:1,_id:0}),第二条的查询结果则为除了name,其他的都显示。

2、简单条件查询

(1)等于查询
db.student.find({age:20})

db.student.find({age:20},{name:1,sex:1})

第一条语句查询所有age等于20的数据,且显示所有字段。第二条语句则是查询age等于20的数据,且只显示_id,name和sex
(2)范围查询 从上面的例子可看出所有的数据操作中是以键值对的形式操作的,所以很明显mongdb不能>,<,!=等这些比较符,而是使用以下比较符
sql mongdb
> $gt
< $lt
>= $gte
<= $lte
!= $ne
in $in
not in $nin

例子
//age不等于20的记录
db.student.find({age:{$ne:20}});

//age等于19,20,21的记录
db.student.find({age:{$in:[19,20,21]}});

3、多条件查询

多条件查询连接符无非就是and 和 or 操作 and操作在mongodb中很简单,他的查询条件为键值对(个人理解为JS中对象的操作,即如查age=20,name=张三的记录则是传个对象student,其age属性为20,name为张三,所以为{age:20,name:"张三"}。同理可得or操作,则需要多个对象,如查age为20,或name为张三的记录,则需{age:20}和{name:“张三”}两个对象,这个了解持久层框架的同学应该很容易理解的),所以and多条件查询,只需将条件用,隔开即可。 而or不要尝试也用,隔开如db.student.find({age:21,age:20}),这句的查询结果只为age=20的记录,要进行or查询则需要操作符$or,进行连接 例子:
//查询age=20 and name=zhangsan
db.student.find({name:"zhangsan",age:20});

//查询age=20 or name=zhangsan
db.student.find($or:[{name:"zhangsan"},{age:20}]);

//查询age=20 or (name=zhangsan and age=21)
db.student.find($or:[{age:20},{name:"zhangsan",age:21}]);

//查询age=20 and (name=zhangsan or name=lisi)
db.student.find({age:20,$or:[{name:"zhangsan"},{name:"lisi"}]})

4、模糊查询

模糊查询,mongodb并没有sql的like语句,但相对应的它支持更强大的正则表达式,使用正则表达式进行模糊查询,有两种方式第一种关键注意点1、不需要 “ ”,2、使用 / 开始和结束标记。第二种使用关键词$regex 例:
//name包含“李”字 db.student.find({name:/李/}) //name包含“李”字,第二种写法 db.student.find({name:{$regex:"李"}}) //name为z开头,n结尾 db.student.find({name:/^z.*n$/}) //name不含有"李"字 db.student.find({name:{$not:/李/}})

5、复杂查询,可使用$where

mongodb可使用js语句,再做复杂查询的时候,可以使用js进行筛选,db.student.find({$where:function(){}}),其中function返回true则为所需要的记录。例
//查询数学成绩大于80的记录
db.student.find({$where:function{
    var score=null;
    for(var i=0;i80){
           return true;
        }
     }
     return false;
}});

6、游标

上面说了,mongodb在shell中支持js,那么当我们执行语句 var s=db.student.find(); 后,s不是为student数组而是游标,但也支持使用s[i]来获取对应下标的student对象。(起初我没看文档,直接尝试用s[0]可以获取到对象,所以一开始我以为是数组) 需要注意以下几点 (1)获取记录的数量:s.size(),s.length(),s.count(),都可以获取数量 (2)是否有下条记录:s.hasNext(),true即表示有下一条 (3)游标移到下一条记录:s.next(); (4)游标销毁条件1、客户端主动销毁,2、游标迭代完毕(即s.hasNest()为false时,经测试直接输出s和获取s[s.size()]时也为迭代完毕)。3、默认超过10分钟没有 (5)经测试在迭代完毕后确实使用p.hasNext()为false,p.next()也获取不到数据,但获取长度和使用下标获取数据是可以的即s.size().和s[i]是可以获取到数据的,所以可以使用js进行for循环再次获取对应的数据。但我不知道有没有时间限制靠不靠谱。

相关TAG标签
上一篇:MySQL带LIKE关键字的查询
下一篇:路由协议概述(3)
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站