查找在数组属性中包含通过MongoDB传递给查询的数组中任何元素的子字符串的任何文档

时间:2018-11-30 23:33:27

标签: mongodb mongoose

我正在创建一本在线烹饪书,遇到了一个试图查询MongoDB的问题。 用户可以选择多种成分,然后将其作为数组传递,以使用mongoose查询数据库。 在DB中,对于每个文档,我都想查询带有type:Array的字段成分。问题是,例如,香蕉可以在数据库中另存为“ 5个成熟的香蕉”,而用户只能选择子字符串“ banana”。换句话说,我如何才能在数据库中找到包含其内容的任何文档成分数组是传递的数组中任何元素的子字符串?

我确实找到了没有子字符串部分的匹配项:

app.get('/recipe', (req, res) => {
    if (req.query.ingredients){
        let ingredients = req.query.ingredients.map(x => JSON.parse(x).name);

        // find any document to include in its ingredients list a substring of any of the elements in the ingredients array
        Recipe.find({ingredients: {$in: ingredients}}).then((recipes) => {
            console.log("recipes" + recipes);
            if (!recipes) {
                res.status(404).send();
            }
            res.status(200).send(recipes);
        }, (e) => {
            res.status(400).send();
        })
    }
});

但是我如何添加子字符串问题(“ 5个成熟的香蕉”-“香蕉”)?

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式$regex并像这样搜索您的各种配料:

Recipe.find({ingredients: { $regex: /banana/ }}).then((recipes) => ...

在您的情况下,由于您有一个要用作filter的数组,因此可以将这些查询与Promise.map一起单独运行。在以下方面:

app.get('/recipe', (req, res) => {
   if (req.query.ingredients) {
       let ingredientMap = req.query.ingredients.map(x => 
          Recipe.find({ingredients: {$regex: new RegExp(JSON.parse(x).name})}});

       return Promise.all(ingredientMap).then((results) => ... )
    }
});

然后从Promise.map结果数组中,您将为每种成分获得匹配的文件。