使用MongoDB查询数组字段以查找与多个值的子字符串匹配的文档

时间:2018-12-01 21:32:09

标签: node.js mongodb

我将配方保存在数据库中,每个配方都有类型Text的配料字段。到查询中,我传递了一系列成分,例如: Array,我想在db的配料字段中找到所有配方,每个配方都传递给查询。问题是传递给查询的成分通常是数据库中成分的子字符串,因此,例如,数据库中的文档的成分数组中可以包含“ 1个成熟的香蕉”,而在查询中我传递“ banana”,这意味着此文件应返回有结果。结果文件应包括通过的每种成分。

我确实设法使用此方法找到了所有食谱,包括至少     代码:

["banana", "apple", "watermelon"]

但是如何进行查询,其中每个结果都包含所有传递给查询的成分(以子字符串的形式)?

1 个答案:

答案 0 :(得分:1)

您可以通过更改正则表达式来以其他方式实现这一目标。

req.query.ingredients(例如["banana", "apple", "watermelon"])遍历数组并编写此regEx:

(?=.*banana)(?=.*apple)(?=.*watermelon).+

以下几行内容:

const ing = ["banana", "apple", "watermelon"]
const result = `${ing.reduce((r,c) => r.concat(`(?=.*${c})`), "")}.+`
console.log(result)

这是使用正向预测,如果在食谱中找到所有成分,则将匹配。这还应该消除使用Promise.all的需要,因为您只需要一个mongoDB find查询。

您可以测试regEx here

还要确保您通过$options使用mongo进行不区分大小写的搜索:

{'$regex' : '<YOUR-REGEX>', '$options' : 'i'}

否则,如果有人真的BANANAS关于您的一种食谱中的成分……您将不会找到它:)