mongoose之find查询


find()

Model.find(filter[, projection][, options][, callback])

参数一:filter

  1. 查找全部
Model.find()
Model.find({})
  1. 精确查找
Model.find({字段名:"值"})
  1. 使用操作符
对比相关操作符
符号 描述
$eq 与指定的值相等
$ne 与指定的值不相等
$gt 大于指定的值
$gte 大于等于指定的值
$lt 小于指定的值
$lte 小于等于指定的值
$in 与查询数组中指定的值中的任何一个匹配
$nin 与查询数组中指定的值中的任何一个都匹配
Model.find({age:{$in:[16,18]}})

//返回字段等于16或者18的所有数据

逻辑相关操作符

符号 描述
$and 满足数组中指定的所有条件
$nor 不满足数组指定的所有条件
$or 满足数组中指定的条件的其中一个
$not 反转查询,返回不满足指定条件的文档
//相关语法
{$and:[ {expression1},{expression2}, ... ,{expressionN} ]}
{$nor:[ {expression1},{expression2}, ... ,{expressionN} ]}
{$or:[ {expression1},{expression2}, ... ,{expressionN} ]}
{$field:[ $not:{<operator-expression>} ]}

//逻辑操作符中的比较字段不存在的情况
Model.find({age:{$not:{$lte:16}}})
//返回age字段大于16或者age字段不存在的文档
字段相关操作符
符号 描述
$exists 匹配存在指定字段的文档{field:{$exists:}}
$type 返回字段属于指定类型的文档{field:{$type:}}

嵌套对象字段的查找

数据如下

  {
    name:{first:"dora",last:"wang"}
  }

精确匹配,顺序、字段都必须一致

  Model.find({name:{last:"wang",first:"dora"}})
  //[]找不到数据

使用.语法,可匹配嵌套的字段,其中字段名必须用引号引起来

  Model.find({"name.last":"wang"})

数组字段的查找

符号 描述
$all 匹配包含查询数组中指定的条件的所有数组字段
$elemMatch 匹配数组字段中的某个值满足$elemMatch 中指定的所有条件
$size 匹配数组字段的 length 与指定的大小一样的 document

数据如下:

{year:[2018,2019]}
{year:[2017,2019,2020]}
{year:[2016,2020]}
查找数组中的至少一个值

可使用精确查找写法 {field: value}

Model.find({ year: 2019 });
// { "\_id" : ..., "year" : [ 2018, 2019 ] }
// { "\_id" : ..., "year" : [ 2017, 2019, 2020 ] }
查找数组中的多个值

使用 $all 查找同时存在 2019 和 2020 的 document

Model.find({ year: { $all: [ 2019, 2020 ] } });
// { "_id" : ..., "year" : [ 2017, 2019, 2020 ] }
操作符组合查询

可使用操作符进行筛选,{:{operator: value}},比如 $in

Model.find({ year: { $in: [ 2018, 2020 ] } });
// { "_id" : ..., "year" : [ 2018, 2019 ] }
// { "_id" : ..., "year" : [ 2017, 2019, 2020 ] }

使用操作符组合查询 {:{operator1: value1, operator2: value2}}

Model.find({ year: { $gt: 2019, $lt: 2018 } });
// { "\_id" : ..., "year" : [ 2017, 2019, 2020 ] }
// { "\_id" : ..., "year" : [ 2016, 2020 ] }

数组字段包含满足查询条件的元素,可以是不同元素分别满足条件也可以是同一个元素满足所有条件,如上例,是一个值满足大于 2019 的条件,另一个值满足小于 2018 的条件。

$elemMatch 单个字段值满足所有查询条件

$elemMatch 查找数组字段中的值同时满足所有条件的 document。

{field: { $elemMatch: { , , … }}}

Model.find({ year: { $elemMatch: { $gt: 2016, $lt: 2018 } } })
// { "_id" : ..., "year" : [ 2017 ] }

数组下标查询

Model.find({ 'year.1': { \$gt: 2019 } })
// { "\_id" : ..., "year" : [ 2016, 2020 ] }
//数组 year 的第二个值大于 2019。

数组对象的查找

数据如下

{author: [{name: "dora", age: 18 },{name: "wang", age: 16 }]}

精确查询

精确匹配,顺序、字段都必须一致。

Model.find({ author: { name: "dora", age: 18 } })

点语法查询

Model.find({ 'author.age': { $gte: 18 } })

$elemMatch 同时满足所有查询条件

Model.find({ "author": {$elemMatch: {name: 'dora', age:{ $lt: 18 }}})
// []

参数二:projection

指定要包含或排除哪些 document 字段(也称为查询“投影”),必须同时指定包含或同时指定排除,不能混合指定,_id 除外。

在 mongoose 中有两种指定方式,字符串指定和对象形式指定。

字符串指定时在排除的字段前加 - 号,只写字段名的是包含。

Model.find({},'age');
Model.find({},'-name');

对象形式指定时,1 是包含,0 是排除。

Model.find({}, { age: 1 });
Model.find({}, { name: 0 });

使用 select() 方法定义

Model.find().select('name age');
Model.find().select({ name: 0 });

参数三:options

// 三种方式实现
Model.find(filter,null,options)
Model.find(filter).setOptions(options)
Model.find(filter).<option>(xxx)

options 选项见官方文档 Query.prototype.setOptions()。

  1. sort:按照排序规则根据所给的字段进行排序,值可以是 asc, desc, ascending, descending, 1, 和 -1。
  2. limit:指定返回结果的最大数量
  3. skip:指定要跳过的文档数量
  4. lean:返回普通的 js 对象,而不是 Mongoose Documents。建议不需要 mongoose 特殊处理就返给前端的数据都最好使用该方法转成普通 js 对象。
// sort 两种方式指定排序
Model.find().sort('age -name'); // 字符串有 - 代表 descending 降序
Model.find().sort({age:'asc', name:-1});

sort 和 limit 同时使用时,调用的顺序并不重要,返回的数据都是先排序后限制数量。

// 效果一样
Model.find().limit(2).sort('age');
Model.find().sort('age').limit(2);

参数四:callback

传入

Mongoose 中所有传入 callback 的查询,其格式都是 callback(error, result) 这种形式。如果出错,则 error 是出错信息,result 是 null;如果查询成功,则 error 是 null, result 是查询结果,查询结果的结构形式是根据查询方法的不同而有不同形式的。

find() 方法的查询结果是数组,即使没查询到内容,也会返回 [] 空数组。

不传

不传入 callback 时,查询方法返回的是一个 Query 实例,实例继承了 Query 原型 上的所有方法,因此返回的实例可以链式调用其它方法,从而组成查询链。

let query = Model.find({ name: 'Dora' });

query.select('name age -_id');

文章作者: 崔行建
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 崔行建 !
评论
 上一篇
JS字符串取后几位 JS字符串取后几位
字符串取值例如:信息与艺术学院/软件工程==如果取后四位,如何取?== 对于字符串来说,首先要拿到字符串长度,再使用字符串截取方法.substring(start,end)得到后几位字符串 var data = "信息与艺术学院/软件工程"
2020-12-05
下一篇 
Mongoose报错E11000 Mongoose报错E11000
错误:MongoDB 中出现 E11000 duplicate key error collection: blog.users index问题原因:MONGODB_id 重复 解决方法 自己在写入 Mongodb 数据库时,重写_id,并
2020-11-30
  目录