使用Mongoose查询食材列表为给定ID子集的Recipe文档
解决方案
你原本的查询思路是正确的,只需要在$elemMatch的匹配规则里指定嵌套的ingredient字段即可,正确写法如下:
Recipe.find({ ingredients: { $not: { $elemMatch: { ingredient: { $nin: ingredients } } } } })
逻辑说明
$elemMatch会遍历ingredients数组的每个子元素,这里的规则是匹配「子元素的ingredient字段不在给定的食材ID列表中」的项- 外层的
$not对匹配结果取反,最终返回的就是「不存在任何食材ID不在给定列表中」的配方,也就是所有用到的食材都属于给定列表的配方
如果需要语义更直白的写法,可以用$expr搭配$setIsSubset操作符实现完全相同的效果:
Recipe.find({ $expr: { $setIsSubset: ["$ingredients.ingredient", ingredients] } })
这个写法直接表达了「当前配方用到的所有食材ID集合,是给定食材ID列表的子集」的逻辑,和你的需求完全匹配。
内容的提问来源于stack exchange,提问作者feychu
相关产品推荐
相关产品推荐

