通过示例学习 Mongoose 中的 find() 方法

发布于 2022-08-10 12:40:21 字数 6088 浏览 177 评论 0

Mongoose 中, Model.find() 函数 是查询数据库的主要工具。 第一个参数 Model.find() 是一个 filter 目的。 MongoDB 将搜索所有匹配的文档 filter,如果您传递一个空过滤器, MongoDB 将返回所有文档

在本教程中,您将了解如何在 Mongoose 中通过构建 filter 使用 MongoDB 查询运算符

平等检查

假设你有一个 Character 包含来自《星际迷航:下一代》的 5 个角色的模型。

const Character = mongoose.model('Character', mongoose.Schema({
  name: String,
  age: Number,
  rank: String
}));

await Character.create([
  { name: 'Jean-Luc Picard', age: 59, rank: 'Captain' },
  { name: 'William Riker', age: 29, rank: 'Commander' },
  { name: 'Deanna Troi', age: 28, rank: 'Lieutenant Commander' },
  { name: 'Geordi La Forge', age: 29, rank: 'Lieutenant' },
  { name: 'Worf', age: 24, rank: 'Lieutenant' }
]);

假设你想找到所有的字符 rank 是 中尉。 做到这一点的方法是通过 { rank: 'Lieutenant' } 作为 filter

const docs = await Character.find({ rank: 'Lieutenant' });

// MongoDB may return the docs in any order unless you explicitly sort
docs.map(doc => doc.name).sort(); // ['Geordi La Forge', 'Worf']

您也可以按年龄查询。 例如,下面的查询将查找所有字符 age 是 29。

const docs = await Character.find({ age: 29 });

docs.map(doc => doc.name).sort(); // ['Geordi La Forge', 'William Riker']

上面的示例不使用任何查询运算符。 如果你设置的值 rank 到一个对象 $eq property ,您会得到一个等效的查询,但使用的是 查询运算符 。 这 $eq 查询运算符通常没用。 但是此示例演示了查询运算符语法,您需要它来构建非平凡的查询。

// Equivalent to `{ rank: 'Lieutenant' }`. `$eq` is an example of
// a "query operator"
const docs = await Character.find({ rank: { $eq: 'Lieutenant' } });

docs.map(doc => doc.name).sort(); // ['Geordi La Forge', 'Worf']

比较

$eq 查询运算符检查完全相等。 还有 比较查询运算符 ,例如 $gt$lt,例如,假设您要查找年龄为严格小于 29。您可以使用 $lt 查询运算符 如下所示。

const docs = await Character.find({ age: { $lt: 29 } });

docs.map(doc => doc.name).sort(); // ['Deanna Troi', 'Worf']

假设您要查找年龄至少为 29 岁的所有角色。为此,您应该使用 $gte 查询运算符

const docs = await Character.find({ age: { $gte: 29 } });

// ['Geordi La Forge', 'Jean-Luc Picard', 'William Riker']
docs.map(doc => doc.name).sort();

比较运算符 $lt, $gt, $lte$gte 不仅仅是数字。 您还可以在字符串、日期和其他类型上使用它们。 MongoDB 使用 unicode order
如果该顺序不适合您,您可以使用 MongoDB collat​​ions

const docs = await Character.find({ name: { $lte: 'Geordi La Forge' } });

// ['Deanna Troi', 'Geordi La Forge']
docs.map(doc => doc.name).sort();

常用表达

假设您要查找其字符 rank 包含 指挥官。 在 SQL 中,您将使用 LIKE 运算符,在 Mongoose 中,您可以简单地通过正则表达式进行查询,如下所示。

const docs = await Character.find({ rank: /Commander/ });

// ['Deanna Troi', 'William Riker']
docs.map(doc => doc.name).sort();

等效地,您可以使用 $regex 查询运算符 。 这使您能够将正则表达式作为字符串传递,如果您从 HTTP 请求中获取查询,这很方便。

const docs = await Character.find({ rank: { $regex: 'Commander' } });

// ['Deanna Troi', 'William Riker']
docs.map(doc => doc.name).sort();

组成与 $and$or

如果设置多个 filter 属性,MongoDB 查找与所有过滤器属性匹配的文档。 例如,下面的查询将查找所有字符 age 至少 29 岁 并且 rank 相当于 指挥官。

const docs = await Character.find({
  age: { $gte: 29 },
  rank: 'Commander'
});

// ['William Riker']
docs.map(doc => doc.name);

假设您要查找其字符 age 至少 29 或其 rank 相当于 指挥官。 你需要 $or 查询运算符

const docs = await Character.find({
  $or: [
    { age: { $gte: 29 } },
    { rank: 'Commander' }
  ]
});

// ['Geordi La Forge', 'Jean-Luc Picard', 'William Riker']
docs.map(doc => doc.name).sort();

还有一个 $and 查询运算符 。 您很少需要使用 $and 查询运算符。 的主要用例 $and 是组成多个 $or 运算符。 例如,假设您要查找同时满足以下两个条件的字符:

  1. age 至少 29 岁或其 rank 等于 指挥官
  2. name 以 D 之前或 W 之后的字母开头。
const docs = await Character.find({
  $and: [
    {
      $or: [
        { age: { $gte: 29 } },
        { rank: 'Commander' }
      ]
    },
    {
      $or: [
        { name: { $lte: 'D' } },
        { name: { $gte: 'W' } }
      ]
    }
  ]
});

// ['William Riker']
docs.map(doc => doc.name).sort();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

偏爱你一生

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

eins

文章 0 评论 0

世界等同你

文章 0 评论 0

毒初莱肆砂笔

文章 0 评论 0

初雪

文章 0 评论 0

miao

文章 0 评论 0

qq_zQQHIW

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文