mongodb的简单查询

     此篇文章简单的记录一下mongodb 的简单查询操作。

 

一、数据准备:

db.persons.insertMany([
    {'userId':1,name:'张三','age':20,'scores':[80,90,100],father : {name:'张三三','age':46}},
    {'userId':2,name:'李四','age':21,'scores':[80,95,98],father : {name:'李四四','age':50}},
    {'userId':3,name:null,'age':22,'scores':[20,40,90]},
    {'userId':4,'age':23,'scores':[60,80,100]},
    {'userId':5,name:'钱七','age':25,'scores':[90,95,100]}
]);

 

二、单个文档,简单文档的查询:

1、返回指定的字段 (返回name和age字段)

db.persons.find({},{name:1,age:1,_id : 0})

   注意:1、默认会返回 _id 字段,如果想不要返回,给 _id : 0 即可。

              2、find() 方法的第二个参数指定需要返回的字段,字段:1 表示返回 字段:-1 表示不返回

              3、第二个方法中不可同时出现  字段 :1 和 字段 : -1这种格式,但是  _id 可以是 -1

 

2、查询 name=22 的人员,直接使用 $eq 操作符

db.persons.find({age : 22});
db.persons.find({age:{$eq: 22}});

 

3、查找 name>22 的人员,使用 $gt 操作符

db.persons.find({age:{$gt: 22}});

 

4、查找 name>=22 的人员,使用 $gte 操作符

db.persons.find({age:{$gte: 22}});

 

5、查找 name<22 的人员,使用 $lt 操作符

db.persons.find({age:{$lt: 22}});

 

6、查找 name<=22 的人员,使用 $lte 操作符

db.persons.find({age:{$lte: 22}});

 

7、查找 name>20 && name<=22 的人员

db.persons.find({age:{$gt:20,$lte: 22}});

 

8、查找 name 不是 李四 的人员,使用 $ne 操作符

db.persons.find({name:{$ne: "李四"}})


9、查询 name=张三 && age>20 的人 ,使用 $and 操作符

db.persons.find({name:"张三",age:{$gt: 20}});
db.persons.find({$and: [{name:"张三"},{age:{$gt: 20}}]})

 

10、查询 name=张三 || age>20 的人 ,使用 $or 操作符

db.persons.find({$or: [{name:"张三"},{age:{$gt: 20}}]})

 

11、查询 name不是张三&&age不是>20的人,使用 $nor 操作符,即$or的取反

db.persons.find({$nor: [{name:"张三"},{age:{$gt: 20}}]})

 

12、查找 userId > 1 and ( name='李四' or age = 23 ) 的用户,即 $and $or 操作符的混合使用

 

db.persons.find({
    userId : {$gt : 1},
    $or : [{name : '李四'},{age : 23}]
});

db.persons.find({
    $and : [{
        userId : {$gt : 1},
        $or : [{name : '李四'},{age : 23}]
    }]
});
 

13、查找 name 不是李四 的人,使用 $not 操作符

db.persons.find({name:{$not: {$eq: "李四"}}});
db.persons.find({name:{$not: /^李四$/}})

   注意:1、$not 作用在其它条件之上,用于取反操作

              2、$not 用于查找不是这个值的数据,如果某个记录中没有$not查找的字段,该记录也会出来。

              3、$not 不可作为顶级操作符,即find($not:{})这种形式

 

14、查找 age%5=0 的人,使用 $mod 操作符

db.persons.find({age:{$mod: [5, 0]}})

   解释:表示查询出 age 和 5进行求模,余数为0 的记录。

 

15、查询 age in (20,30,25) 的人,使用 $in 操作符

db.persons.find({age:{$in: [20,30,25]}})


    注意: 官网建议,当在同一个字段上进行查询时,应该使用$in操作符,而不是 $or 操作符,即能用 $in完成就不要使用$or完成。

 

16、查询 age not in (20,30,25) 的人,使用 $nin 操作符

db.persons.find({age:{$nin: [20,30,25]}})

 

17、$all 表示键需要匹配所有的值

    * 查找 age = 20 && age = 25 的人,使用 $all 操作符

db.persons.find({age:{$all: [20,25]}})

    * 查找 scores 同时存在 80 和 90 的人,使用 $all 操作符

db.persons.find({scores:{$all: [80,90]}})

   注意:1、$all 一般用来匹配数组中的元素。

              2、$all 匹配元素必须都要存在,和数组中的元素的顺序无关。

 

18、只查询 name 字段存在 && 值不为李四的记录,使用 $exists 操作符

db.persons.find({name:{$exists: true,$nin: ["李四"]}})

 

19、匹配 name=null 的情况,默认情况下会匹配出 name 不存在的记录

   * 匹配 name=nullname不存在的情况

db.persons.find({name:null})

   * 只匹配 name=null 的记录

db.persons.find({name:{$eq: null,$exists: true}})

 

20、正则表达式的使用,查找 name like '张%' 的记录,使用正则表达式

db.persons.find({name:/^张/})

 

21、查询总共有多少人。

db.persons.find({}).count()

 

三、数组的匹配

1、单个元素的匹配,格式 {key:valie} , 比如查询 scores 中存在 80 的元素

db.persons.find({scores:80})

 

2、多个元素的匹配,格式{key:{$all:[xxx,yyy]}},比如:查询 scores 中同时存在 80和90的元素,80和90在scores中的顺序无所谓,没有影响。

db.persons.find({scores:{$all: [80,90]}})

 

3、匹配数组中第几个角标对应的值是多少,比如:查询 scores中的第二个元素 90

db.persons.find({"scores.1":90})

   注意:数组角标是从 0 开始。

 

4、查询指定长度的数组,比如:查询 scores 数组的长度 =3 的数组

db.persons.find({"scores":{$size:3}})

 

5、返回数组中的子集,使用 $slice 操作符,正数表示返回前面多少条,负数表示返回后面多少条,区间表示跳过多少条和返回多少条,如下图所示:

 

6、查询数组中的某一个元素,要符合给定查询条件,使用$elemMatch。比如:查询 name=张三 scores > 90 && scores < 90,结果如下图所示:

 

 四、内嵌文档的查询:

1、查询 father.name=张三三 的文档

db.persons.find({"father.name":"张三三"})

2、内嵌文档的查询,和普通的文档查询是一样的。只是内嵌文档需要 写 "xxx.yyy" 需要加上双引号。

 

五、分页查询:

db.persons.find().skip(2).limit(2)

    skip:  表示跳过多少条记录

    limit:  表示需要返回多少条记录

 

六、排序操作

db.persons.find({}).sort({age:1})

    注意:1、age : 1 表示根据 age 正序排序

               2、age : -1 表示根据 age 倒序排序

               3、如果需要多个字段排序,中间以逗号分隔即可。

 

 

posted @ 2018-04-14 16:22  huan1993  阅读(62)  评论(0编辑  收藏  举报