Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose获取与数组交叉点匹配的所有文档_Javascript_Mongodb_Mongoose - Fatal编程技术网

Javascript Mongoose获取与数组交叉点匹配的所有文档

Javascript Mongoose获取与数组交叉点匹配的所有文档,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,通过数组交集,我的意思是,清单中的元素比每个document Components数组中的元素多得多,我想从查询中得到的结果是清单中包含所有数组元素的所有文档$所有结果都是零,因为库存中的元素比成分中的元素多,即使所有成分都在库存中 我有数千个文档,它们有一个字符串数组字段 { ... recipe: "recipe1", ingredients: [ "1 cup cooked quinoa", "6 tbsp butter"

通过数组交集,我的意思是,清单中的元素比每个document Components数组中的元素多得多,我想从查询中得到的结果是清单中包含所有数组元素的所有文档$所有结果都是零,因为库存中的元素比成分中的元素多,即使所有成分都在库存中

我有数千个文档,它们有一个字符串数组字段

{
 ...
  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" ]
 ...
}
我试图找到所有文档,其中
成分
数组中的所有元素都包含在一个包含大量元素的示例数组中,假设这个示例数组只包含以下内容:

inventory = [ "lemons", "butter", "egg", "milk", "bread", "salmon", "asparagus", "pepper" ]
有了这个清单数组,我想得到recipe2和recipe3。
现在我有了这个库存数组和查询(感谢):

查询:

    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" ]
 ...
}

但我得到的结果为零

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

  • 首先,您可以通过
    |
    顺序符号加入字符串数组并生成一个字符串,并在
    $regex
    搜索中使用它
  • $filter
    迭代
    成分循环
  • $regexMatch
    要匹配的元素有任何匹配的单词
  • $size
    获取筛选元素的总大小
  • $eq
    匹配过滤结果和实际
    成分
    相等

谢谢,这解决了数组迭代的问题,但这会给我所有三种配方,因为库存中都含有黄油,所有配方中都含有黄油。因此,我需要的是只获取通过库存与它们自己的成分字段的交叉点的文档。我已经用
$all
选项更新了这个问题,我不确定,你能解释一下数组交集是什么意思吗?不确定这个映射应该如何与新的RegExp一起工作,我从映射中得到类似的东西:[{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{“{},{},{},{},{},{},{},{},{},{},{}]它将返回正则表达式字符串,请看我添加了您可以运行的代码段并查看控制台结果。通过数组交叉,我的意思是,清单中的元素比每个文档成分多得多,我想从查询中得到的结果是库存中包含所有数组元素的所有文档$由于库存映射输出,所有都不起作用,但我认为$all将使我得到零结果,因为库存中的元素比配料中的元素多
{
 ...
  recipe: "recipe2",
  ingredients: [ "2 lemons", "2 tbsp butter", "1 large egg" ]
 ...
}
{
 ...
  recipe: "recipe3",
  ingredients: [ "1lb salmon", "1 pinch pepper", "4 spears asparagus" ]
 ...
}
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" }
    ]
  }
})