通过示例学习 Mongoose 中的 find() 方法
在 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 collations 。
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
运算符。 例如,假设您要查找同时满足以下两个条件的字符:
age
至少 29 岁或其rank
等于 指挥官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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论