前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过Model.find查找数据方法

通过Model.find查找数据方法

原创
作者头像
艳艳代码杂货店
修改2021-09-26 09:40:26
1.5K0
修改2021-09-26 09:40:26
举报
文章被收录于专栏:艳艳代码杂货店

查找数据

通过Model.find方法

不传入参数会查找该表的所有数据 该方法返回值始终是数组

第一个参数

指定数据的某个键进行查找,键也能是正则表达式

代码语言:javascript
复制
const data = await User.find({ name: /\d/ });

限制查找范围,通过内置的字段限制某个字段的范围,$where函数参数来指定查询的限制范围

代码语言:javascript
复制
const data = await User.find({
    name: { $gt: 1 },
    $where: () => this.passWord == parseInt(this.email),
}); // 查找name大于1且密码和邮箱一样的

还能通过$and $or $not等参数来决定查找的范围

代码语言:javascript
复制
const data = await User.find({
    $or: [{ $and: [{ name: /[1,2]/ }, { email: /(@qq.com)$/ }] }, { name: /\w+/ }],
}); // 查找 name为1或2且为QQ邮箱 或 name为字符串 的数据

如果查找的是对象中的属性用字符串做键或者嵌套查找

注意 嵌套查找必须顺序一致

代码语言:javascript
复制
// 查找这条数据 { name: "4", email: "357@163.com", passWord: "357", bio: { head: 123, foot: 789 } }
const datas = await User.find({ "bio.head": 123 }); // 字符串查找
const datas = await User.find({ bio: { head: 123, foot: 456 } }); // 嵌套对象查找 对象要写全且顺序不能改变,里面只能用具体的数据,不能用正则表达式或其它的限制

如果查找的是数组中的某项

代码语言:javascript
复制
// 有这两条数据 { name: "4", email: "357@163.com", passWord: "357", bio: [123, 456, "hahaha"] }
//             { name: "5", email: "258@163.com", passWord: "258", bio: [123, 789, "haha"] }
const datas = await User.find({ bio: 123 }); // 如果数组中有一个数据符合就会找到 也能像上面一样用特殊参数指定范围
const datas = await User.find({ bio: { $all: [123, 456] } }); // 查找含有这两个值 只能找到第二条
const datas = await User.find({ bio: { $in: [456, 789] } }); // 查找这两个值中的任意一条 两条都能找到
const datas = await User.find({ "bio.1": { $gt: 456 } }); // 使用下标指明指定数据的范围 这里找到第二条

如果查找的是数组对象中的某项

代码语言:javascript
复制
// 有这两条数据
{
    name: "4",
    email: "357@163.com",
    passWord: "357",
    bio: [
        { head: 123, foot: 456 },
        { head: 456, foot: 789 },
    ],
},
{
    name: "5",
    email: "258@163.com",
    passWord: "258",
    bio: [
        { head: 123, foot: 789 },
        { head: 789, foot: 456 },
    ],
}
代码语言:javascript
复制
const datas = await User.find({ bio: { head: 123, foot: 789 } }); // 数组中含有这个对象就会找到,对象属性要写全,不能只写部分,循序不能修改
const datas = await User.find({ "bio.foot": 789 }); // 数组中只要有一个对象符合就会找到,这里两个都会找到
const datas = await User.find({
    bio: { $elemMatch: { foot: 456, head: { $gt: 100 } } }, // 使用$elemMatch 数组中拥有指定的对象就会找到,可以交换顺序,可以使用限制,但是不能使用正则
});

第二个参数

限制返回数据含有的数据

代码语言:javascript
复制
const data = await User.find({ name: /\d/ }, { name: 1, email: 1, _id: 0 }); // _id默认带着,这里忽略了

第三个参数

可以使用keip limit sort来对查询结果进行操作

代码语言:javascript
复制
const data = await User.find({ name: /\d/ }, null, { skip: 1 }); // 这里只会查找到 2 3

第二三个参数也能用链式调用的方法定义

查询的结果支持链式调用,可以使用一些方法再对结果进行操作,相当于把第二个参数写道外面了

  • select:设置查询结果的数据包含哪些键 接收列明字符串组成的数组,如果字符串前加上-则是不显示 const datas = await User.find().select(["name", "-_id"]); // 查询所有数据 返回对象只有name
  • limit:限制查找结果的长度
  • skip:设置查找结果的起式位置
  • sort:对查找结果排序 接收列名字符串,按照从小到大排序,如果前面加上-则会从大到小排 const datas = await User.find().sort("-name"); // str 3 2 1 const datas = await User.find().sort("name"); // 1 2 3 str
  • count:返回查找结果的数量
  • lean:将结果返回为普通的js对象而不是查询得到的Mongoose Documents类型对象

常用的内置字段:

字段

说明

$or

或关系

$nor

或关系取反

$gt

大于

$gte

大于等于

$lt

小于

$lte

小于等于

$ne

不等于

$in

在多个值范围内

$nin

不在多个值范围内

$all

匹配数组中多个值

$regex

正则,用于模糊查询

$size

匹配数组大小

$type

匹配数据的类型

$maxDistance

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

$mod

取模运算

$near

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

$exists

字段是否存在

$elemMatch

匹配内数组内的元素

$within

范围查询(基于LBS)

$box

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

$center

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

$centerSphere

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

$slice

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

通过Model.findOne方法

该方法返回符合条件的第一条数据

通过Model.findById方法

通过每个数据的_id属性查询

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 查找数据
  • 通过Model.find方法
  • 第二三个参数也能用链式调用的方法定义
  • 通过Model.findOne方法
  • 通过Model.findById方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档