• 数据表 | _id | name | grades | __v | | —- | —- | —- | —- | | 6017befb5c36d64d08b72576 | 小明 | 68 | 0 | | 6017befb5c36d64d08b72577 | 小芳 | 94 | 0 | | 6017c455ba09d355a49ec8eb | 小红 | 52 | 0 | | 6017c455ba09d355a49ec8ec | 小刚 | 46 | 0 |

1.1【find()

  • Model.find(conditions, [projection], [options], [callback])

  • 参数

conditions:查询条件
[projection]:控制返回字段
[options]:配置查询参数
[callback]:回调函数 – function(err,docs){}

  • 案例:

    1. var mongoose = require('mongoose')
    2. mongoose.connect('mongodb://localhost:27017/student',(err) => {
    3. if(!err){
    4. var schema = new mongoose.Schema({name:String,grades:Number})
    5. var stuModel = mongoose.model('grades',schema)
    6. //查询所有数据
    7. stuModel.find((err,docs) => {
    8. if(!err){
    9. console.log(docs)
    10. }
    11. })
    12. /* [{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
    13. { _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 },
    14. { _id: 6017c455ba09d355a49ec8eb, name: '小红', grades: 52, __v: 0 },
    15. { _id: 6017c455ba09d355a49ec8ec, name: '小刚', grades: 46, __v: 0 }]*/
    16. //查询成绩大于60以上的数据
    17. stuModel.find({grades:{$gte:60}},(err,docs) => {
    18. if(!err){
    19. console.log(docs)
    20. }
    21. })
    22. /*[{ _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 },
    23. { _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }]*/
    24. //查询成绩大于60以上且名字里存在‘芳’的数据
    25. stuModel.find({name:/芳/,grades:{$gte:60}},(err,docs) => {
    26. if(!err){
    27. console.log(docs)
    28. }
    29. })
    30. /*[
    31. * { _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }
    32. * ]*/
    33. //查询名字里存在‘明’的数据且只输出‘name’字段
    34. //_id默认会返回
    35. stuModel.find({name:/明/},{name:1,_id:0},(err,docs) => {
    36. if(!err){
    37. console.log(docs)
    38. }
    39. })
    40. // [{name: '小明'}]
    41. //找出跳过前两条数据的其他数据
    42. stuModel.find(null,null,{skip:2},(err,docs) => {
    43. if(!err){
    44. console.log(docs)
    45. }
    46. })
    47. /*[{ _id: 6017c455ba09d355a49ec8eb, name: '小红', grades: 52, __v: 0 },
    48. { _id: 6017c455ba09d355a49ec8ec, name: '小刚', grades: 46, __v: 0 }]*/
    49. }
    50. })

    1.2【findById()

  • Model.findById(id, [projection], [options], [callback])

  • 案例: ```javascript var mongoose = require(‘mongoose’) mongoose.connect(‘mongodb://localhost:27017/student’,(err) => { if(!err){

    1. var schema = new mongoose.Schema({name:String,grades:Number})
    2. var stuModel = mongoose.model('grades',schema)
    3. //保存查询数据的_id
    4. var aIDArr = []
    5. //查询所有数据
    6. stuModel.find((err,docs) => {
    7. if(!err){
    8. docs.forEach((item,index,arr)=>{
    9. aIDArr.push(item._id)
    10. })
    11. //显示第 0 个元素的所有字段
    12. stuModel.findById(aIDArr[0],(err,doc)=>{
    13. if(!err){
    14. console.log(doc)
    15. }
    16. })
    17. // { _id: 6017befb5c36d64d08b72576, name: '小明', grades: 68, __v: 0 }
    18. //显示第 0 个元素且只输出name字段
    19. stuModel.findById(aIDArr[0],{name:1,_id:0},(err,doc)=>{
    20. if(!err){
    21. console.log(doc)
    22. }
    23. })
    24. // { name: '小明' }
    25. //显示第 0 个元素且输出最少的字段(_id默认输出)
    26. stuModel.findById(aIDArr[0],{lean:true},(err,doc)=>{
    27. if(!err){
    28. console.log(doc)
    29. }
    30. })
    31. // { _id: 6017befb5c36d64d08b72576 }
    32. }
    33. })

    } })

  1. <a name="WSx0B"></a>
  2. ### 1.3【**findOne()**】
  3. - 返回查询到的数据的第一个
  4. - `Model.findOne([conditions], [projection], [options], [callback])`
  5. - 案例:
  6. ```javascript
  7. var mongoose = require('mongoose')
  8. mongoose.connect('mongodb://localhost:27017/student',(err) => {
  9. if(!err){
  10. var schema = new mongoose.Schema({name:String,grades:Number})
  11. var stuModel = mongoose.model('grades',schema)
  12. //找出age>20的文档中的第一个文档
  13. stuModel.findOne({grades:{$gt:80}},(err,doc) => {
  14. if(!err){
  15. console.log(doc)
  16. }
  17. })
  18. //{ _id: 6017befb5c36d64d08b72577, name: '小芳', grades: 94, __v: 0 }
  19. //找出age>20的文档中的第一个文档,且只输出name字段
  20. stuModel.findOne({grades:{$gt:80}},{name:1,_id:0},(err,doc) => {
  21. if(!err){
  22. console.log(doc)
  23. }
  24. })
  25. //{ name: '小芳' }
  26. //找出age>20的文档中的第一个文档,且输出包含name字段在内的最短字段
  27. stuModel.findOne({grades:{$gt:80}},{lern:true},(err,doc) => {
  28. if(!err){
  29. console.log(doc)
  30. }
  31. })
  32. //{ _id: 6017befb5c36d64d08b72577 }
  33. }
  34. })

1.4 复杂查询【$where】

  • $where 可以使用任意的 JavaScript 作为查询的一部分,包含JavaScript 表达式的字符串或者函数

  • 案例:

    1. var mongoose = require('mongoose')
    2. mongoose.connect('mongodb://localhost:27017/student',(err) => {
    3. if(!err){
    4. var schema = new mongoose.Schema({name:String,grades:Number})
    5. //添加一个测试字段
    6. // schema.add({test:Number})
    7. var stuModel = mongoose.model('grades',schema)
    8. //添加两条数据
    9. // stuModel.create([{name:"小花",grades:76,test:76},{name:"小兰",grades:60,test:30}],(err,docs)=>{
    10. // console.log(docs)
    11. // })
    12. //字符串 es5中this与obj指向一样,es6中只能用obj
    13. stuModel.find({$where:"this.grades == this.test" || "obj.grades == obj.test"},(err,doc) => {
    14. if(!err){
    15. console.log(doc)
    16. }
    17. })
    18. //[{_id: 6017d7cb8a95cb2a00aae3ae,name: '小花',grades: 76,test: 76,__v: 0}]
    19. //函数
    20. stuModel.find({$where:function() {
    21. return this.grades == this.test || obj.grades == obj.test*2
    22. }},(err,doc) => {
    23. if(!err){
    24. console.log(doc)
    25. }
    26. })
    27. /*[{_id: 6017d7cb8a95cb2a00aae3ae,name: '小花',grades: 76,test: 76,__v: 0},
    28. {_id: 6017d7cb8a95cb2a00aae3af,name: '小兰',grades: 60,test: 30,__v: 0}]*/
    29. }
    30. })

1.5 常用查询条件

$or     或关系

$nor    或关系取反

$gt     大于

$gte    大于等于

$lt     小于

$lte    小于等于

$ne     不等于

$in     在多个值范围内

$nin    不在多个值范围内

$all    匹配数组中多个值

$regex   正则,用于模糊查询

$size    匹配数组大小

$maxDistance  范围查询,距离(基于LBS)

$mod     取模运算

$near    邻域查询,查询附近的位置(基于LBS)

$exists   字段是否存在

$elemMatch  匹配内数组内的元素

$within    范围查询(基于LBS)

$box     范围查询,矩形范围(基于LBS)

$center    范围醒询,圆形范围(基于LBS)

$centerSphere 范围查询,球形范围(基于LBS)

$slice     查询字段集合中的元素(比如从第几个之后,第N到第M个元素

1.6 * 特定类型查询

  • 数据表 | _id | name | grades | __v | test | | —- | —- | —- | —- | —- | | 6017befb5c36d64d08b72576 | 小明 | 68 | 0 | 1 | | 6017befb5c36d64d08b72577 | 小芳 | 94 | 0 | 3 | | 6017c455ba09d355a49ec8eb | 小红 | 52 | 0 | 5 | | 6017c455ba09d355a49ec8ec | 小刚 | 46 | 0 | 2 | | 6017d7cb8a95cb2a00aae3ae | 小花 | 76 | 0 | 4 | | 6017d7cb8a95cb2a00aae3af | 小兰 | 60 | 0 | 6 |

方法

方法 作用
sort 排序
skip 跳过
limit 限制
select 显示字段
exect 执行
count 计数
distinct 去重

案例:

  1. const mongoose = require('mongoose')
  2. mongoose.connect('mongodb://localhost:27017/student')
  3. var Schema =new mongoose.Schema({ name:String,grades:Number,test:{type:Number,default:0}})
  4. var stuModel = mongoose.model('grades', Schema);
  5. // 按test从小到大排序
  6. stuModel.find().sort('test').exec((err,docs)=>{
  7. console.log(docs)
  8. })
  9. // 按test从大到小排列
  10. stuModel.find().sort('-test').exec((err,docs)=>{
  11. console.log(docs)
  12. })
  13. // 跳过1个,显示其他
  14. stuModel.find().skip(1).exec((err,docs)=>{
  15. console.log(docs)
  16. })
  17. // 显示2个
  18. stuModel.find().limit(2).exec((err,docs)=>{
  19. console.log(docs)
  20. })
  21. // 显示name、grades字段,不显示_id字段
  22. stuModel.find().select('name grades -_id').exec((err,docs)=>{
  23. console.log(docs)
  24. })
  25. // 跳过第1个后,只显示2个数据,按照grades由大到小排序,且不显示_id字段
  26. stuModel.find().skip(1).limit(2).sort('-grades').select('-_id').exec((err,docs)=>{
  27. console.log(docs)
  28. /*[{ name: '小明', grades: 78, __v: 0, test: 1 },
  29. { name: '小花', grades: 76, test: 4, __v: 0 }]*/
  30. })
  31. // 显示集合stuModel中的文档数量
  32. stuModel.find().count((err,count)=>{
  33. console.log(count)
  34. //6
  35. })
  36. // 返回集合stuModel中的grades的值
  37. stuModel.find().distinct('grades',(err,distinct)=>{
  38. console.log(distinct)
  39. //[ 46, 52, 60, 76, 78, 94 ]
  40. })