Mongoose/MongoDB PUT:如果对象 ID 在数组中唯一,则将对象推送到数组
Mongoose/MongoDB PUT: Push Object to Array if Object ID is unique within Array
我想更新文档中的数组,前提是被推送到“items”数组的对象在“items”数组中具有唯一 ID。
{
"_id": "6039e37cb6b60f4694a16705",
"list_name": "Example Picklist",
"author_id": "6027f627141a75567cc2e0b0",
"author_name": "Test",
"items": [
{
"upcs": [
"111222333"
],
"qty": 10,
"id": "123456",
"name": "Item A"
},
{
"upcs": [
"444555666"
],
"qty": 22,
"name": "Item B",
"id": "987654"
}
],
"status": "initialized",
"__v": 0
}
例如,我应该可以添加:
{
"name": "Item C",
"qty": 99,
"upcs": ["111555999"],
"id": "111111"
}
但不是:
{
"name": "Item C",
"qty": 99,
"upcs": ["111555999"],
"id": "123456"
}
在我尝试实施 JohnnyHK's answer to this 问题后,我的放置请求目前没有拒绝 req.bodys 已经存在的 ID。
router.put('/:id', auth, async (req, res) => {
const item = req.body; // insert above examples
try {
let picklist = await Picklist.findById(req.params.id);
if (!picklist)
return res.status(404).json({ json: 'Picklist not found' });
picklist = await Picklist.findByIdAndUpdate(
{ _id: req.params.id, 'items.id': { $ne: item.id } },
{
$push: { items: item },
},
{ new: true }
);
res.json(picklist);
} catch (err) {
console.error(err.message);
res.status(500).json({ msg: 'Server Error' });
}
});
我哪里错了?目前它将推送任何符合架构的内容,并且不会阻止 ID 重复。
错误是我在使用
Picklist.findByIdAndUpdate()
而不是
Picklist.findOneAndUpdate()
我想更新文档中的数组,前提是被推送到“items”数组的对象在“items”数组中具有唯一 ID。
{
"_id": "6039e37cb6b60f4694a16705",
"list_name": "Example Picklist",
"author_id": "6027f627141a75567cc2e0b0",
"author_name": "Test",
"items": [
{
"upcs": [
"111222333"
],
"qty": 10,
"id": "123456",
"name": "Item A"
},
{
"upcs": [
"444555666"
],
"qty": 22,
"name": "Item B",
"id": "987654"
}
],
"status": "initialized",
"__v": 0
}
例如,我应该可以添加:
{
"name": "Item C",
"qty": 99,
"upcs": ["111555999"],
"id": "111111"
}
但不是:
{
"name": "Item C",
"qty": 99,
"upcs": ["111555999"],
"id": "123456"
}
在我尝试实施 JohnnyHK's answer to this 问题后,我的放置请求目前没有拒绝 req.bodys 已经存在的 ID。
router.put('/:id', auth, async (req, res) => {
const item = req.body; // insert above examples
try {
let picklist = await Picklist.findById(req.params.id);
if (!picklist)
return res.status(404).json({ json: 'Picklist not found' });
picklist = await Picklist.findByIdAndUpdate(
{ _id: req.params.id, 'items.id': { $ne: item.id } },
{
$push: { items: item },
},
{ new: true }
);
res.json(picklist);
} catch (err) {
console.error(err.message);
res.status(500).json({ msg: 'Server Error' });
}
});
我哪里错了?目前它将推送任何符合架构的内容,并且不会阻止 ID 重复。
错误是我在使用
Picklist.findByIdAndUpdate()
而不是
Picklist.findOneAndUpdate()