我正在尝试获取在其keywords数组中包含任何指定关键字或所有关键字的文档。当我只在$all
运算符的数组中传递一个关键字时,它只返回一个文档,而不是包含该关键字的所有文档。下面显示了使用$all
运算符时遇到的问题
MONGO DB中的课程列表
1x1米2米1
2x一米三英寸
3x一米四英寸
问题
1db.courses.find({keywords: {$all: ["css", "sass"] } })
不返回任何内容(应返回CSS课程)
2 db.courses.find({keywords: {$all: ["css"] } })
返回CSS课程[仅一个文档]
3 db.courses.find({keywords: {$all: ["javascript"] } })
返回Node.JS课程(还应返回JavaScript课程)
4 db.courses.find({keywords: {$all: ["javascript", "nodejs"] } })
仅返回Node.JS课程(还应返回JavaScript课程)
5 db.courses.find({keywords: {$all: ["javascript", "css"] } })
不返回任何内容(本应返回CSS和JavaScript课程)
1条答案
按热度按时间pw136qt21#
MongoDB
$all
操作符的行为与您预期的不同:(着重号是我的)$all
运算符选择字段值为包含所有指定元素的数组的文档。但是,您似乎并没有匹配 * 所有 * 值,而是希望匹配 * 至少其中一个 *(即查询项和文档项的交集不为空)。
在这种情况下,您应该使用
$in
运算符:(着重号是我的)$in
运算符选择字段值等于指定数组中任意值的文档。[...]
如果字段包含数组,则
$in
运算符选择其字段包含数组的文档,该数组包含**至少一个与指定数组中的值匹配的元素例如,对于第5个查询案例:
实时演示:https://mongoplayground.net/p/KXXKpBjQg-N