首页 > 解决方案 > 按引用属性(不是 id)查找文档

问题描述

我想在一个数组中找到属于一个类别的所有产品,即

我有这个类别的文件:

{
    "_id" : ObjectId("5fa006c9e8c8633bd00dc9bf"),
    "name" : "Beer"
    "__v" : 0
}

{
    "_id" : ObjectId("5fa3f6a69a55a4294815d333"),
    "name" : "Gin"
    "__v" : 0
}

和三个这样的产品:

{
    "_id" : ObjectId("5fc5ba87d5b8e358888e976f"),
    "code" : "CER473HEIN",
    "category" : ObjectId("5fa006c9e8c8633bd00dc9bf"),
    "__v" : 0
}

{
    "_id" : ObjectId("6011e4d83408972b34fd048f"),
    "code" : "GIN700BEEF",
    "category" : ObjectId("5fa3f6a69a55a4294815d333"),
}

{
    "_id" : ObjectId("6011e4f73408972b34fd0492"),
    "code" : "GIN700GORD",
    "category" : ObjectId("5fa3f6a69a55a4294815d333"),
}

如果在请求的正文中,我发送一个这样的数组:

{ 类别 = ['啤酒', '杜松子酒']` }

我想获得所有三种产品,但如果我只发送“啤酒”,我只想获得“啤酒”类别的产品。

我在产品的服务层尝试过这样的事情:

let getProductsByCategories = (req, res) => {
    const { categories } = req.body; 
    Product.find({ 'category.name' : { $in: categories }})
        .exec((err, productos) => {
            if (err) {
                return res.status(500).json({
                    ok: false,
                    error: 'Error interno en el servidor'
                });
            }
            if (!productos) {
                return res.status(400).json({
                    ok: false,
                    error: {
                        message: 'No se encontraron productos.'
                    }
                });
            }

            res.json({
                ok: true,
                cantidad: productos.length,
                entidadResultante: productos
            });
        })
}

IE:

但它总是返回 0 个产品,类别为 6 个产品。知道为什么会这样吗?泰。

标签: node.jsmongodbmongoose

解决方案


如果您ref在模式中使用,您可以使用填充,但没有ref您应该编写两个查询,首先获取 Id 的类别列表,req.body.categories然后您可以获得产品列表

 let getProductsByCategories = (req, res) => {
    const { categories } = req.body; 
    Category.find({ 'category.name' : { $in: categories }})
        .exec((err, categoryID) => {
            if (err) {
                return res.status(500).json({
                    ok: false,
                    error: 'Error interno en el servidor'
                });
            }
            if (!categoryID) {
                return res.status(400).json({
                    ok: false,
                    error: {
                        message: 'categoryID'
                    }
                });
            }
            let listOfIds = categoryID.map(item => item._id)
            Product.find({ 'category' : { $in: listOfIds }})
            .exec((err, productos) => {
                res.json({
                    ok: true,
                    cantidad: productos.length,
                    entidadResultante: productos
                });
            })

        })
}

如果您在架构中使用 ref,请尝试这样:

  Product.find()
    .populate({
      path: "category",
      match: {
        "category.name": { $in: categories },
      },
    })
    .exec(function (err, productos) {
      console.log(productos);
    });
};

推荐阅读