找不到 ID 并更新和递增子文档 - returns null Mongoose/mongoDB
Cannot find id and update and increment sub-document - returns null Mongoose/mongoDB
我遇到一个问题,我似乎无法检索数组中嵌套对象的 _id。特别是我的对象数组的食物部分。我想找到 _id,让我们说意大利调味饭,然后动态增加订单计数(来自同一个对象)。
我正在尝试动态完成此操作,因为我在 req.body._id 中尝试了 Risotto id,这很好,但我无法继续并尝试增加订单,因为我得到 null。
出于某种原因,我一直得到 null,我认为它是一个嵌套文档,但我不确定。这也是我的路由文件和架构。
router.patch("/update", [auth], async (req, res) => {
const orderPlus = await MenuSchema.findByIdAndUpdate({ _id: '5e3b75f2a3d43821a0fb57f0' }, { $inc: { "food.0.orders": 1 }}, {new: true} );
//want to increment orders dynamically once id is found
//not sure how as its in its own seperate index in an array object
try {
res.status(200).send(orderPlus);
} catch (err) {
res.status(500).send(err);
}
});
架构:
const FoodSchema = new Schema({
foodname: String,
orders: Number,
});
const MenuSchema = new Schema({
menuname: String,
menu_register: Number,
foods: [FoodSchema]
});
这是返回的数据库JSON
{
"_id": "5e3b75f2a3d43821a0fb57ee",
"menuname": "main course",
"menu_register": 49,
"foods": [
{
"_id": "5e3b75f2a3d43821a0fb57f0",
"foodname": "Risotto",
"orders": 37
},
{
"_id": "5e3b75f2a3d43821a0fb57ef",
"foodname": "Tiramisu",
"orders": 11
}
],
"__v": 0
}
菜单名称的 id 在它的位置有效,但我不需要它,因为我需要访问食物子文档。提前致谢。
您正在向 MenuSchema.findByIdAndUpdate 更新查询发送食物 ID (5e3b75f2a3d43821a0fb57f0
)。它应该是 5e3b75f2a3d43821a0fb57ee
的菜单 ID
您可以通过它的 id 找到菜单,并使用 mongodb $ positional operator.
使用食物 _id 或食物名称更新它是其中一种食物
通过提供菜单 ID 和食物 ID 进行更新:
router.patch("/update", [auth], async (req, res) => {
try {
const orderPlus = await MenuSchema.findByIdAndUpdate(
"5e3b75f2a3d43821a0fb57ee",
{ $inc: { "foods.$[inner].orders": 1 } },
{ arrayFilters: [{ "inner._id": "5e3b75f2a3d43821a0fb57f0" }], new: true }
);
res.status(200).send(orderPlus);
} catch (err) {
res.status(500).send(err);
}
});
通过提供菜单 ID 和食物名称进行更新:
router.patch("/update", [auth], async (req, res) => {
try {
const orderPlus = await MenuSchema.findByIdAndUpdate(
"5e3b75f2a3d43821a0fb57ee",
{ $inc: { "foods.$[inner].orders": 1 } },
{ arrayFilters: [{ "inner.foodname": "Risotto" }], new: true }
);
res.status(200).send(orderPlus);
} catch (err) {
res.status(500).send(err);
}
});
我遇到一个问题,我似乎无法检索数组中嵌套对象的 _id。特别是我的对象数组的食物部分。我想找到 _id,让我们说意大利调味饭,然后动态增加订单计数(来自同一个对象)。
我正在尝试动态完成此操作,因为我在 req.body._id 中尝试了 Risotto id,这很好,但我无法继续并尝试增加订单,因为我得到 null。
出于某种原因,我一直得到 null,我认为它是一个嵌套文档,但我不确定。这也是我的路由文件和架构。
router.patch("/update", [auth], async (req, res) => {
const orderPlus = await MenuSchema.findByIdAndUpdate({ _id: '5e3b75f2a3d43821a0fb57f0' }, { $inc: { "food.0.orders": 1 }}, {new: true} );
//want to increment orders dynamically once id is found
//not sure how as its in its own seperate index in an array object
try {
res.status(200).send(orderPlus);
} catch (err) {
res.status(500).send(err);
}
});
架构:
const FoodSchema = new Schema({
foodname: String,
orders: Number,
});
const MenuSchema = new Schema({
menuname: String,
menu_register: Number,
foods: [FoodSchema]
});
这是返回的数据库JSON
{
"_id": "5e3b75f2a3d43821a0fb57ee",
"menuname": "main course",
"menu_register": 49,
"foods": [
{
"_id": "5e3b75f2a3d43821a0fb57f0",
"foodname": "Risotto",
"orders": 37
},
{
"_id": "5e3b75f2a3d43821a0fb57ef",
"foodname": "Tiramisu",
"orders": 11
}
],
"__v": 0
}
菜单名称的 id 在它的位置有效,但我不需要它,因为我需要访问食物子文档。提前致谢。
您正在向 MenuSchema.findByIdAndUpdate 更新查询发送食物 ID (5e3b75f2a3d43821a0fb57f0
)。它应该是 5e3b75f2a3d43821a0fb57ee
您可以通过它的 id 找到菜单,并使用 mongodb $ positional operator.
使用食物 _id 或食物名称更新它是其中一种食物通过提供菜单 ID 和食物 ID 进行更新:
router.patch("/update", [auth], async (req, res) => {
try {
const orderPlus = await MenuSchema.findByIdAndUpdate(
"5e3b75f2a3d43821a0fb57ee",
{ $inc: { "foods.$[inner].orders": 1 } },
{ arrayFilters: [{ "inner._id": "5e3b75f2a3d43821a0fb57f0" }], new: true }
);
res.status(200).send(orderPlus);
} catch (err) {
res.status(500).send(err);
}
});
通过提供菜单 ID 和食物名称进行更新:
router.patch("/update", [auth], async (req, res) => {
try {
const orderPlus = await MenuSchema.findByIdAndUpdate(
"5e3b75f2a3d43821a0fb57ee",
{ $inc: { "foods.$[inner].orders": 1 } },
{ arrayFilters: [{ "inner.foodname": "Risotto" }], new: true }
);
res.status(200).send(orderPlus);
} catch (err) {
res.status(500).send(err);
}
});