mongodb高级查询

数据查询

  • 方法find():查询
    db.集合名称.find({条件文档})
  • 方法find():查询,只返回第一个
    db.集合名称.findOne({条件文档})
  • 方法pretty():将结果格式化
    db.集合.find({条件文档}).pretty()

比较运算符

  • 等于:默认是等于判断,没有运算符
  • 小于:$lt(less than)
  • 小于等于:$lte(less than equal)
  • 大于等于:$gte
  • 不等于:$ne
db.stu.find({age:{$gte:18}})

范围运算符

使用"$in","$nin"判断是否在某个范围内
查询年龄为18、28的学生

db.stu.find({age:{$in:{19,28,38}}})

$not
语法: { field: { $not: { } } }

$nor额外比较
考虑入校操作:

db.inventory.find( { $nor: [ { price: 1.99 }, { qty: { $lt: 20 } }, { sale: true } ] }
inventory集合查询所有的文档,条件如下:

字段price不等于1.99,字段qty不小于20,字段sale不等于true;查询的结果包含不存在的字段;

逻辑运算符

  • and:在json中写多个条件即可查询年龄大于或等于18,并且性别为true的学生
db.stu.find({age:{$gte:18},gender:true})
  • or:使用$or,值为数组,数组中每个元素为json查询年龄大于18,或性别为false的学生
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
  • 查询年龄大于18或性别为男生,并且姓名是郭靖
db.stu.find({$or:[{age:{$gt:18}},{gender:true}],name:'gj'})

支持正则表达式

使用//或$regex编写正则表达式
查询姓黄的学生

db.produces.find({sku:/^abc/})  
db.produces.find({sku:{$regex:'789$'})

limit和skip

  • 方法limit():用于读取指定数量的文档
    db.集合名称.find().limit(NUMBER)
    查询2条学生信息
db.stu.find().limit(2)
  • 方法skip():用于跳过指定数量的文档
    db.集合名称.find().skip(NUMBER)
db.stu.find().skip(2)
  • 同时使用
    db.stu.find().limit(4).skip(5)

    db.stu.find().skip(5).limit(4)

自定义查询

使用$where后面写一个函数,返回满足条件的数据查询年龄大于30的学生

db.stu.find({
    $where:function() {
        return this.age>30;
    }
})

投影

在查询到的返回结果中,只选择必要的字段
db.集合名称.find({},{字段名称:1,...})

参数为字段与值,值为1表示显示,值为0不显
特殊:对于_id列默认是显示的,如果不显示需要明确设置为0

db.stu.find({},{_id:0,name:1,gender:1})

排序

方法sort(),用于对集进行排序
db.集合名称.find().sort({字段:1,...})
参数1为升序排列
参数-1为降序排列
根据性别降序,再根据年龄升序

db.stu.find().sort({gender:-1,age:1})

统计个数

方法count()用于统计结果集中文档条数
db.集合名称.find({条件}).count()
db.集合名称.count({条件})

db.stu.find({gender:true}).count()  
db.tu.count({age:{$gt:20},gender:true})

消除重复

方法distinct()对数据进行去重

db.集合名称.distinct('去重字段',{条件})
db.stu.distinct('distinct',{age:{$gt:18}})
原文地址:https://www.cnblogs.com/colden/p/9865185.html