javascript - 如何在 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。
解决方案
我的错误在于我如何创建订单以及提出过滤请求。
使用数组类型存储数据创建订单的正确方法如下
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”参数。
推荐阅读
- ruby - 是否有一种算法可以从给定的大于 1 的加数范围中找到总和的所有加数组合?
- c - 保存文件的问题
- javascript - 将 Canvas 应用到我的 Vue.js 项目时出错
- php - 如果我有像 facebook 和 google 这样的社交登录,我应该让数据库中的电子邮件不唯一吗?
- python - pythonanywhere corsheaders 模块未找到错误
- visual-studio-code - VS代码。无法连接到扩展市场
- python-3.x - 使用名称取消异步任务
- visual-studio-code - 点总是替换 vs-code 中第一次打开的文件
- f# - 在 F# 中,如何使用列表索引更新/替换嵌套记录?
- python - 传递给 C++ .dll 的 Ctypes 参数打印出垃圾值