【问题标题】:How to get all the matching values from '$in' operator in mongoose如何从猫鼬中的'$in'运算符获取所有匹配值
【发布时间】:2021-09-15 18:15:58
【问题描述】:

我为不同类别的博客设置了多个复选框 -

我想要实现的是,当我选择一些类别并单击过滤器时,将显示指定的选定博客。我使用查询字符串参数或 URL 参数将所有选中的复选框值发送到 nodejs 后端 -

query 是一个包含所有选定类别的数组

const response = await axios.get(`http://localhost:8000/blog/all?categories=${query}`)

在后台 -

const cat = req.query.categories;

const all = await blogModel.find({ category: { $in: cat } });

我将cat 传递给$in,它再次包含来自前端的所有选定类别,以查找所有匹配的博客。

但我面临的问题是我没有获得匹配的博客,比如当我选择“科学”复选框并单击过滤器时,我能够获得所有具有“科学”类别的博客。但是当我选择说“科学”和“食物”时,我得到一个空数组作为输出,即使我的 MongoDB 中确实有这两个类别的博客。

当我选择“科学”类别时cat 的后端控制台日志 -

当我选择“科学”和“食物”时 -

我得到一个空数组作为输出,而不是“科学”和“食品”类别的所有博客。

总而言之,当我选择多个类别时,我得到一个空数组而不是所选类别的博客。当我只选择一个类别时,我能够获得所选博客。它不适用于多个类别

我确信我错过了一些东西,但不知道用谷歌搜索什么才能得到正确的结果。我也经历了类似的 StackOverflow 问题,但我无法理解需要做什么。我正在为我的投资组合构建一个简单的博客网站,并考虑添加这个“按类别过滤”功能,以便我可以学习如何使用 mongoose 从 MongoDB 中过滤值。请帮我解决这个问题。谢谢。

编辑 1 - 这是我收藏的文档示例

当我从上面的复选框中选择“科学”和“食物”时,“console.log(req.query.categories)”也会输出这个 -

【问题讨论】:

    标签: node.js mongodb express mongoose query-parameters


    【解决方案1】:

    我认为你没有将数据作为array 传递给 mongo 查询 先由,分割,然后传递给查询

    const cat = req.query.categories;
    cat = cat.split(",")
    const all = await blogModel.find({ category: { $in: cat } });
    

    【讨论】:

    • 你好@mohammad Naimi,我尝试添加你提到的代码行,但现在没有任何内容被过滤。即使我选择了一些类别,我也得到了所有博客。
    • 试试const all = await blogModel.find({ category: { $in: ["Food"] } });看看有没有结果?
    • 是的,现在只要我选择任何类别,就会显示“食品”类别的博客。
    • 只有当我选择多个类别时,我才会遇到这个问题,当我只选择一个类别时,我能够过滤掉博客。
    • 你添加数组硬编码了吗?
    【解决方案2】:

    是的,您的查询似乎没有问题,请确保您将正确的数据传递给后端,就像您将“食物”作为类别保存在数据库中并搜索“食物”一样,它将返回空数组,因为它区分大小写。 db.Posts.find({category: { $in:["Food","Gaming"]}}) 你也可以试试这种方式获取 db.Posts.aggregate([{$match:{category: {$in:["cat","dog"]}}}])

    【讨论】:

    • 你好@kumol,所有类别的名称在数据库和前端都相同,即“食物”等。我试过你提到的“聚合”,但没有用。我每次都得到所有的博客。
    • 只有当我选择多个类别时,我才会遇到这个问题,当我只选择一个类别时,我能够过滤掉博客。
    • 能否分享一个你的数据库的集合示例和console.log(req.query.categories)的结果
    • 我添加了您要求的相应图片,请检查编辑。谢谢
    • 您在查询参数中传递了一个类别数组,但它在 nodejs 中作为字符串接收。所以首先根据逗号分割这个字符串 "," 它会创建一个对象 将此对象更改为数组然后在搜索过滤器中使用此数组 "// let cat = req.query.category ? req.query.category.split(", ") : [] let categories = Object.entries(cat).map(ca=>{return ca[1]}); .find({category: {$in:categories}})//" 请保留你的参数like => category=cat,tiger
    【解决方案3】:

    const cat = req.query.categories; var splitcat = cat .split(",");

    db.Posts.find({category: { $in:splitcat }})

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2023-03-19
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多