Mongoose获取与数组交集匹配的所有文档

3

所谓数组交集,指的是库存元素数量远多于每个文档原料数组的情况下,希望从查询结果中获得所有数组元素均包含在库存中的文档。即使所有原料都包含在库存中,$all 也会返回零结果,因为库存中的元素数量超过了原料中的元素数量。

我有数千个具有字符串数组字段的文档。

{
 ...
  recipe: "recipe1",
  ingredients: [ "1 cup cooked quinoa", "6 tbsp butter", "1 large egg" ]
 ...
},
{
 ...
  recipe: "recipe2",
  ingredients: [ "2 lemons", "2 tbsp butter", "1 large egg" ]
 ...
}
{
 ...
  recipe: "recipe3",
  ingredients: [ "1lb salmon", "1 pinch pepper", "4 spears asparagus" ]
 ...
}

我正在尝试查找所有文档,其中ingredients数组中的所有元素都包含在一个包含许多元素的样本数组中。比方说,对于这种情况,它只包含这些内容:

inventory = [ "lemons", "butter", "egg", "milk", "bread", "salmon", "asparagus", "pepper" ]

使用此库存数组,我想获取食谱2和食谱3。
目前我有这个库存数组和查询(感谢turivishal):

    let inventory = ["lemons", "butter", "egg", "milk", "bread", "salmon", "asparagus", "pepper"];
inventory = inventory.map((i) => new RegExp(i, "i"));

查询:

    Recipe.find({
  ingredients: { $all: inventory }
})

预期结果:

{
 ...
  recipe: "recipe2",
  ingredients: [ "2 lemons", "2 tbsp butter", "1 large egg" ]
 ...
}
{
 ...
  recipe: "recipe3",
  ingredients: [ "1lb salmon", "1 pinch pepper", "4 spears asparagus" ]
 ...
}

但我没有得到任何结果

1个回答

1

您可以尝试使用$expr表达式条件在mquery中使用聚合运算符,

  • 首先,您可以通过|顺序符号连接字符串数组并制作一个字符串,并在$regex搜索中使用它,
  • $filter迭代循环ingredients
  • $regexMatch匹配具有任何匹配单词的元素
  • $size获取过滤元素的总大小
  • $eq匹配过滤结果和实际ingredients相等
let inventory = ["lemons", "butter", "egg", "milk", "bread", "salmon", "asparagus", "pepper"];
let inventoryStr = inventory.join("|");
// "lemons|butter|egg|milk|bread|salmon|asparagus|pepper"

Recipe.find({
  $expr: {
    $eq: [
      {
        $size: {
          $filter: {
            input: "$ingredients",
            cond: {
              $regexMatch: {
                input: "$$this",
                regex: inventoryStr,
                options: "i"
              }
            }
          }
        }
      },
      { $size: "$ingredients" }
    ]
  }
})

游乐场


谢谢,这解决了数组迭代问题,但是这会给我所有三个食谱,因为库存包含黄油,而所有食谱都包含黄油。所以我需要的是只获取通过库存与它们自己的成分字段相交的文档。话虽如此,我认为我需要更改问题标题以查找数组交集。 - Jarki
我已经使用$all选项更新了问题,但我不确定您所说的数组交集是什么意思,能否解释一下? - turivishal
不确定新的 RegExp 应该如何与地图配合工作,我从地图中得到了类似于这样的东西:[{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}]。 - Jarki
它将返回正则表达式字符串,看到我已经添加了代码片段,您可以运行并查看控制台结果。 - turivishal
通过数组交集,我指的是库存比每个文档成分都有更多元素,并且我想从查询中得到的结果是所有文档,其中所有数组元素都包含在库存中。$all不起作用是因为库存映射输出,但我认为$all会让我得到零结果,因为库存比成分中可以找到的元素更多。 - Jarki
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接