在 MongoDB 中,可以使用 $elemMatch 操作符通过查询数组中的元素进行匹配,而在 Mongoose 中,可以通过 Query 类提供的类似功能来实现相同的操作。
$elemMatch 操作符用于匹配数组中满足特定条件的元素。在 MongoDB 中,可以将 $elemMatch 运算符用在查询或更新操作中。而在 Mongoose 中,并不是所有查询类型都支持 $elemMatch,仅适用于嵌套文档中的数组。
Mongoose 中使用 $elemMatch 操作符时,需要用到 Query 类的 $elemMatch 方法。
Model.find({ arr: { $elemMatch: { field1: value1 } }}, callback);
对于某个数组 arr,上述代码将查找包含键值对 {field1: value1} 的文档。
如果想要在一个查询中对多个条件运用 $elemMatch,使用以下语法:
Model.find({ arr: { $elemMatch: { $and: [{ field1: value1 }, { field2: value2 }] } } }, callback);
$elemMatch 与普通查询的区别
假如现有一个文档 Schema 为:
-- -------------------- ---- ------- ----- ---------- - --- ----------------- ------ ------- -------- ------- --------- -- ------- ------- ----- ------- ----- ---- -- ---
以下两种查询实现了相同的功能,但是:使用 $elemMatch 时,返回的结果将会是整个嵌套文档集合,每个嵌套文档都包含所有的键值对。而没有使用 $elemMatch 的查询,则只包含符合条件的键值对。
使用 $elemMatch:
Post.find({ comments: { $elemMatch: { author: 'John', body: 'Great post!' } } });
不使用 $elemMatch:
Post.find({ 'comments.author': 'John', 'comments.body': 'Great post!' });
相关例子
- 查找至少有一个评论的帖子
Post.find({ comments: { $exists: true, $not: { $size: 0 } } }, callback);
- 查找至少包含一条被颜值为 9 的评论的帖子
Post.find({ comments: { $elemMatch: { 'author.username': 'John', 'author.age': { $gte: 18 } } } }, callback);
- 查找至少包含一条评论的作者可以被称为“程序员”的帖子
Post.find({ comments: { $elemMatch: { 'author.profession': /.*Programmer.*/i } } }, callback);
注意事项
注意以下几点需要细心处理:
- 如果要使用 $elemMatch 操作符,数组中必须嵌套其他文档。
- $elemMatch 只适用于嵌套数组的文档。
- 如果查询条件中嵌套多个 $elemMatch 操作符,则需要将它们封装在 $and 操作符中。
结论
$elemMatch 操作符是 MongoDB 和 Mongoose 中十分有用的功能,让我们可以对数组中的数据进行更加精准的匹配。学会了它的用法,我们就可以更加灵活地使用 MongoDB 和 Mongoose 进行数据操作。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67525fdd8bd460d3ad9380f6