mongodb笔记——查询,以下举例操作集合为以下格式。
student集合(不要太在意这表的设计,只是为方便举例而已)
_id | name | age | sex | score | books |
123 | 张三 | 20 | man | [{name:"语文",score:90},{name:"英语",score:90},{name:"数学",score:90}] | ["java","OC","js","mongodb"] |
db.student.find()
db.student.find({},{name:1}) db.student.find({},{name:0})
db.student.find({age:20}) db.student.find({age:20},{name:1,sex:1})
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]}});
//查询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"}]})
//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:/李/}})
//查询数学成绩大于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循环再次获取对应的数据。但我不知道有没有时间限制靠不靠谱。