一、Find详细讲解
数据准备:person.json

215527286.jpg

1、指定返回的键(字段)
db.[documentName].find({条件},{指定键})
示例:
1.1、查询出所有数据的指定键(name,age)
     db.person.find({},{_id:0,name:1,age:1})

2、查询条件

215112623.jpg

 

示例:
2.1 查询出年龄在25到27岁之间的学生
db.person.find({age:{$gte:25,$lte:27}},{_id:0,name:1,age:1})
2.2 查询出所有不是韩国国籍的学生的数学成绩
db.person.find({country:{$ne:"Korea"}},{_id:0,name:1,m:1})

3、包含或不包含($in或$nin)
示例:
3.1 查询国籍是中国或美国的学生信息
db.person.find({country:{$in:["USA","China"]}},{_id:0,name:1,country:1})
3.2 查询国籍不是中国或美国的学生信息
db.person.find({country:{$nin:["USA","China"]}},{_id:0,name:1,country:1})

4、OR查询($or)
示例:
4.1 查询语文成绩大于85或者英语成绩大于90的学生信息
db.person.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]},{_id:0,name:1,c:1,e:1})

5、NULL
示例:
5.1 把中国国籍的学生上增加新的键sex
db.person.update({country:"China"},{$set:{sex:"man"}},false,true)
5.2 查询出sex等于null的学生
db.person.find({sex:{$in:[null]}},{_id:0,name:1,sex:1})

6、正则表达式查询
示例:
6.1 查询出名字中存在“li”的学生信息
db.person.find({name:/li/i},{_id:0,name:1})

7、$not的使用
$not可以用到任何地方进行取反操作
示例:
7.1 查询出名字中不存在“li”的学生信息
db.person.find({name:{$not:/li/i}},{_id:0,name:1})

8、数组查询$all和index应用
示例:
8.1 查询喜欢看MongoDB的和JS的学生
db.person.find({books:{$all:["MpngDB","JS"]}},{_id:0,name:1,books:1})
8.2 查询第二本书是JAVA的学习信息
db.person.find({"books.1":"JAVA"}},{_id:0,name:1,books:1})

9、查询指定长度数组$size,它不能与比较查询符一起使用
示例:
9.1 查询出喜欢的书籍数量是4本书的学生信息
db.person.find({books:{$size:4}},{_id:0,name:1,books:1})
9.2 查询出喜欢的书籍数量大于3本的学生
(1)增加字段size
db.person.update({},{$set:{size:4}},false,true)
(2)改变书籍的更新方式,每次增加书籍的时候,size增加1
db.person.update({查询器},{$push:{books:"Oracle"},$inc:{size:1}})
(3)利用$gt查询
db.person.find({size:{$gt:3}})
9.3 利用shell查询出Jim喜欢看的书的数量(游标)
var person=db.person.find({name:Jim})
while(person.hasNext())
{
 var obj=person.next();
 print(obj.books.length)
}
10、$slice操作符返回文档中指定数组的内部值
示例:
10.1 查询出Jim书架中第2~4本书
db.person.find({name:"Jim"},{books:{"$slice":[1,3]},_id:0,name:1})
10.2 查询出最后一本书
db.person.find({name:"Jim"},{books:{"$slice":-1},_id:0,name:1})

11、文档查询
为Jim添加学习简历文档jim.json

215229703.jpg

 

示例:
11.1 查询出在K上过学的学生
(1)、这个我们用绝对匹配可以完成,但是有些问题(顺序、总要带着score查?)
     db.person.find({school:{school:"K",score:"A"}},{_id:0,name:1,school:1})
(2)、为了解决顺序的问题,我可以用对象"."的方式定位
     db.person.find({"school.school":"K","school.score":"A"},{_id:0,name:1,school:1})
(3)、这样也有问题,看下面的例子:
   db.person.find({"school.score":"A","school.school":"J"},{_id:0,name:1,school:1})
 同样能查出刚才那条数据,原因是score和school会去其他对象对比。
(4)、正确的做法是单条条件组查询($elemMatch)
 db.person.find({school:{$elemMatch:{school:"K",score:"A"}}},{_id:0,name:1,school:1})
12、where查询($where)
示例:
12.1 查询年龄大于22岁,喜欢看C++,在K学校上过学的学生信息
    (注意:复杂的查询我们就可以用$where,因为他是万能;但是我们要尽量避免少使用它,因为他有性能代价)
db.person.find({"$where":function(){
 var books=this.books;
 var school=this.school;
 if(this.age>12){
  var php=null;
  for(var i=0;i<books.length;i++){
      if(books[i]=="C++"){
    php=books[i];
   if(school){
     for(var i=0;i<school.length;i++){
       if(school[j].school=="K"){
      return true;
               }
     }
     break;
          }
       }
  }
 }
}})

二、分页与排序
1、Limit返回指定的数据条数
 示例:
    1.1 查询出person文档中前5条数据
    db.person.find({},{_id:0,name:1}).limit(5)
2、skip返回指定数据的跨度
  示例:
    2.1 查询出person文档中5-10条的数据
    db.person.find({},{_id:0,name:1}).limit(5).skip(5)
3、sort返回排序的数据[1(asc),-1(desc)]
  示例:
    3.1 查询出person文档按照年龄排序的数据
    db.person.find({},{_id:0,name:1,age:1}).sort({age:1})
    注意:mongodb的key可以存不同类型的数据,排序就也有优先级。
    排序顺序:最小值、null、数字、字符串、对象/文档、数组、二进制、
              对象ID、布尔、日期、时间戳、正则、最大值。
4、limit和skip完成分页
  4.1 三条数据为一页进行分页
      第一页-->db.person.find({},{_id:0,name:1}).limit(3).skip(0)
      第二页-->db.person.find({},{_id:0,name:1}).limit(3).skip(3)
  4.2 skip有性能问题,没有特殊情况下我们也可以换个思路
      对文档进行重新结构设计(下图)

215018745.jpg

      每次查询操作的时候,前后台传值全要把上次的最后一个文档的日期保存下来。
      db.person.find({data:{$gt:日期数值}}).limit(3)

三、游标
1、游标(特点:自上而下,游标读取到最后一条数据,就会释放资源)
 利用游标遍历查询数据
 var person=db.person.find();
 while(person.hasNext()){
 var obj=person.next();
 print(obj.name);
 }
2、游标几个销毁条件
  (1)、客户端发来信息叫它销毁;
  (2)、游标迭代完毕;
  (3)、默认游标超过10分钟没有使用,也会自动清除。
3、查询快照
  快照后就会针对不变的集合进行游标运动了,看看使用方法:
  db.person.find({$query:{name:"Jim"},$snapshot:true})

四、高级查询选项
$query、$orderby、$maxsan(integer 最多扫描的文档数)、
$min(document 查询开始)、$max(document 查询结束)、
$hint(document 使用哪个索引)、$explain(boolean 统计)、
$snapshot:(boolean 一致快照)