首页 > 解决方案 > 如何在 Mongoose 中正确创建数组模式并按给定条件过滤?

问题描述

我对 mongodb 和 mongoose 很陌生,所以我请你帮助我。我有一个 API,它可以工作,现在我想通过过滤给定参数来扩展它。

我有一个 Order 模型,它指向两个不同的文档集合 Material & User Schemas 并有一个数量元素。

let Order = new Schema({
    materials: 
    {
        type: Array,
        material: { 
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Material'
        },
        qty: {
            type: Number
        }
    },
    userId: {
        type: Schema.Types.ObjectId,
        ref: 'User'
    }
}, {
    collection: 'orders'
})

我也有创建订单的方法:

  exports.createOrder = (req, res) => {
    if (!req.body.user) {
        res.status(400).send({message: 'Content can not be empty!'});
    }
    const order = new Order({
        materials: req.body.materials,
        userId: req.body.user
    });
    order
    .save(order)
    .then(data => {
        res.send(data);
    })
    .catch(err => {
        res.status(500).send({
          message:
            err.message || "Some error occurred while creating the Order."
        });
      });
   }

如果我创建仅填充材料 ID 的订单,它会在过滤器请求中创建和过滤给定的材料 ID。

发布请求

发布请求

过滤请求

在此处输入图像描述

但是,如果我试图指出 qty 它不会出现在响应中。

使用数量发布请求 在此处输入图像描述

过滤请求以前一个文档 id 结尾

在此处输入图像描述

我的问题是:如何以我需要的确切方式创建订单(材料 ID 和数量必须保持不变)以及如何对它们执行过滤操作?

任何帮助appriciated。

标签: javascriptarraysnode.jsmongodb

解决方案


我的错误在于我如何创建订单以及提出过滤请求。

使用数组类型存储数据创建订单的正确方法如下

exports.createOrder = (req, res) => {
    if (!req.body.user) {
        res.status(400).send({message: 'Content can not be empty!'});
    }
    const order = new Order({
        materials: {material: req.body.materials, qty: req.body.qty},
        userId: req.body.user
    });
    order
    .save(order)
    .then(data => {
        res.send(data);
    })
    .catch(err => {
        res.status(500).send({
          message:
            err.message || "Some error occurred while creating the Order."
        });
      });
}

如您所见,不同之处在于我如何形成材料阵列。

接下来是过滤请求

exports.filterOrder = (req, res) => {
  Order.find({"materials.material": req.body.material})
  .then(data => {
    console.log(data);
    res.send(data);
  })
  .catch(err => {
    res.status(500).send({
      message:
        err.message || "Some error occurred while retrieving Orders."
    });
  });
}

如果我需要过滤包含必要材料的订单,我需要将数组的子元素放在带点符号的引号中。如果需要,这也适用于“material.qty”参数。


推荐阅读