【问题标题】:Mongoose get all documents matching array intersectionMongoose 获取所有匹配数组交集的文档
【发布时间】:2021-05-29 16:09:30
【问题描述】:

数组交集的意思是,库存的元素比每个文档成分数组要多得多,我想从查询中得到的结果是所有数组元素都包含在库存中的所有文档。 $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" ]

有了这个库存数组,我想得到 recipe2 和 recipe3。
现在我有这个库存数组和查询(感谢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" ]
 ...
}

但我得到的结果为零

【问题讨论】:

    标签: javascript mongodb mongoose


    【解决方案1】:

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

    • 首先你可以通过|订单符号加入字符串数组并制作一个字符串,并在$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" }
        ]
      }
    })
    

    Playground

    【讨论】:

    • 谢谢,这解决了数组迭代问题,但这会给我所有三个食谱,因为库存包含黄油,所有食谱都包含黄油。所以我需要的是只获取通过库存与他们自己的成分字段相交的文件。话虽如此,我认为我需要更改问题标题才能找到数组交集
    • 我已经用$all 选项更新了问题,我不确定,你能解释一下数组交集是什么意思吗?
    • 不确定地图应该如何与新的 RegExp 一起使用,我从地图中得到了类似的东西:[{},{},{},{},{},{},{} ,{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}]
    • 它将返回正则表达式字符串,看我添加了sn -p 你可以运行并查看控制台结果。
    • 数组交集的意思是,库存的元素比每个文档成分多得多,我想从查询中得到的结果是所有数组元素都包含在库存中的所有文档。由于库存地图输出,$all 不起作用,但我认为 $all 会让我得到零结果,因为库存中的元素比成分中的元素多
    猜你喜欢
    • 2014-05-16
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 2019-06-29
    • 2021-10-13
    相关资源
    最近更新 更多