css MongoDB $all操作符在多个项目传入其数组时,在mongo shell或compass中不返回任何内容

k5ifujac  于 2023-03-20  发布在  Go
关注(0)|答案(1)|浏览(101)

我正在尝试获取在其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课程)

pw136qt2

pw136qt21#

MongoDB $all操作符的行为与您预期的不同:(着重号是我的)
$all运算符选择字段值为包含所有指定元素的数组的文档。
但是,您似乎并没有匹配 * 所有 * 值,而是希望匹配 * 至少其中一个 *(即查询项和文档项的交集不为空)。
在这种情况下,您应该使用$in运算符:(着重号是我的)
$in运算符选择字段值等于指定数组中任意值的文档。
[...]
如果字段包含数组,则$in运算符选择其字段包含数组的文档,该数组包含**至少一个与指定数组中的值匹配的元素
例如,对于第5个查询案例:

db.collection.find({
  keywords: {
    $in: [ // instead of $all operator
      "javascript",
      "nodejs"
    ]
  }
})

// Result: "Node.JS" and "JavaScript" documents

实时演示:https://mongoplayground.net/p/KXXKpBjQg-N

相关问题