【问题标题】:$or doesn't work for subdocument level search$or 不适用于子文档级别的搜索
【发布时间】:2020-10-20 20:48:37
【问题描述】:

搜索仅在父级检索结果。使用 $or 条件搜索返回子文档级别过滤器/搜索的空数组。 $or 不适用于子文档级别的搜索。对此有任何修复或我的代码中有任何错误吗?

exports.getAllProduct = (req, res, next) => {
categories.find({$or:[{“categoryName”:{ $regex: req.params.id, $options: ‘i’ }},
{“subcategory.$.productName”:{ $regex: req.params.id, $options: ‘i’ }}]},
(err, products) => {
   console.log(“Products:“+JSON.stringify(products));
  if (err) {
         return res.status(400).json({
           error: “No Products found”+err
         });
       }
       res.status(200).json(products)
     });
};
const categorySchema = new mongoose.Schema({
        categoryName: {
            type: String,
            trim: true
        },
        subcategory: [ {
            subcategoryName: {
                type: String,
                trim:true
            },
            productCode: {
                type: String,
                trim: true
            }]});

http://localhost:3000/category/getAllProduct/fruits

$or 不工作的原因是什么?我正在使用 mongoDB 4.4.1 和 mongoose 5.10.8 以及 Mac OS Catalina。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    正如我所见,子类别是一个数组..您应该检查 $ 的第二个参数或者输入是否为“$in”数组。 检查这个帖子 MongoDB query IN array of object

    【讨论】:

    • $in 将用于比较相同字段与不同输入。但对于我的情况不同,我正在比较不同的名称,如 categoryName、SubcategoryName、productCode....字段名称不同,所以它不起作用
    【解决方案2】:

    如果我正确阅读了您的 mongo 查询,则您在 subcategory.$.subcategoryName 中有一个 $,这很可能导致您看到的问题。使用 subcategory.subcategoryName 查询该值。

    见下文:

    categories.find({
      $or:[
       {
         “categoryName”:{
           $regex: req.params.id,
           $options: 'i'  
         }
       },
       {
         “subcategory.subcategoryName”: {
           $regex: req.params.id,
           $options: 'i'
         }
       }
      ]},
      (err, products) => {}
    );
    

    此外,请始终尝试像本示例中那样干净地格式化您的代码。它使寻找解决方案变得更加容易。

    如果您不需要查询不区分大小写,则以下查询将更清晰:

    categories.find({
      $or:[
       {
         “categoryName”: req.params.id
       },
       {
         “subcategory.subcategoryName”: req.params.id
       }
      ]},
      (err, products) => {}
    );
    

    【讨论】:

    • 感谢 Patrick,如果我按照您所说的那样删除 $ 符号,但它正在检索子文档数组中的所有文档。仅适用于父级别过滤器适用于子文档级别,它在删除 $ 符号后获取所有记录,但未获取任何记录
    • 例如说有一个子类别名称为 test 1 , test 2 , test 3 的子文档。
    • “subcategory.subcategoryName”: "test 1" // req.params.id 它应该只从子文档中检索测试 1,但它正在从子文档数组中检索所有记录,例如测试 1、测试 2、测试 3
    猜你喜欢
    • 1970-01-01
    • 2011-04-22
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2023-03-31
    • 2015-12-09
    相关资源
    最近更新 更多