如何解决如何在另一个猫鼬方案模型中更新方案中的数组?
我正在尝试构建一个社区存储应用。我的第一个人 / 全栈。我希望人们能够预订/取消预订项目。我想改变它,以便 itemsScheme 将在一个单独的文档中,但是在一个单独的一个文档中考虑所有这些项目让我想知道搜索是否不会更长..我真的没有经验,不知道是什么是最好的方法。它的工作原理是这样的,但是...有时在保留项目时它只将 _id 放在 reservedBy 数组中,有时 - 它会填充!! 这是 gitHub 上存储模式和存储操作的代码:https://github.com/amabelleS/web-mentoring 最具挑战性的具体行动是储备,但老实说,由于缺乏知识/指导/适当的文档,我有点即兴发挥。
这是相关的代码,首先是存储模式,然后是保留操作:
// const { update } = require('./UserModal');
const HttpError = require('../models/http-error');
const Schema = mongoose.Schema;
const itemSchema = new Schema({
_itemId: { type: mongoose.Types.ObjectId,require: true },name: { type: String,required: true },description: { type: String,rentCost: { type: Number,qntInStock: { type: Number,reservedStack: { type: Number,creator: { type: mongoose.Types.ObjectId,required: true,ref: 'User' },reservedBy: [
{
type: mongoose.Types.ObjectId,ref: 'User',pickUpTime: Date,email: { type: String,},],});
const storageSchema = new Schema({
title: { type: String,address: { type: String,location: {
lat: { type: Number,lng: { type: Number,image: { type: String },admins: [{ type: mongoose.Types.ObjectId,ref: 'User' }],activeCommunityUsers: [
{ type: mongoose.Types.ObjectId,storageItems: [itemSchema],});
// storageSchema.methods.findItem = async function (storageId,itemId) {
// let reservedItem;
// console.log(reservedItem);
// try {
// reservedItem = storage.storageItems.find(
// (item) => item._id.toString() === itemId.toString()
// );
// console.log(reservedItem);
// } catch (err) {
// console.log(err);
// return next(
// new HttpError('Somthing went wrong,Could not find storage item',404)
// );
// }
// if (!item) {
// const error = new HttpError('Could not find item for provided id.',404);
// return next(error);
// }
// return item;
// };
module.exports = mongoose.model('Storage',storageSchema);
// @desc RESERVE/UNRESERVE storage item / Update stock
// @route PATCH api/storages/:sid/items/:itemId/reserve
// @access Private
const reserveStorageItem = async (req,res,next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
console.log(errors);
return next(
new HttpError('Ivalid inputs passed,please check your data',422)
);
}
const { reserve } = req.body;
const storageId = req.params.sid;
const itemId = req.params.itemid;
let storage;
try {
storage = await Storage.findById(storageId);
// reservedItem = await
} catch (err) {
return next(
new HttpError('Somthing went wrong,Could not fetch storage',500)
);
}
if (storage && storage.storageItems && storage.storageItems.length === 0) {
return next(
new HttpError('Could not find items for the provided storage id.',404)
);
}
// let reservedItem = storage.findItem(itemId);
let reservedItem;
// console.log(reservedItem);
try {
reservedItem = storage.storageItems.find(
(item) => item._id.toString() === itemId.toString()
);
} catch (err) {
console.log(err);
return next(
new HttpError('Somthing went wrong,404)
);
}
if (!reservedItem) {
const error = new HttpError('Could not find item for provided id.',404);
return next(error);
}
let user;
try {
user = await User.findById(req.userData.userId);
} catch (err) {
const error = new HttpError(
'Reserving storage item Failed,please try again.',500
);
return next(error);
}
if (!user) {
const error = new HttpError('Could not find user for provided id.',404);
return next(error);
}
try {
const sess = await mongoose.startSession();
sess.startTransaction();
if (
reservedItem &&
user &&
reservedItem.reservedStack < reservedItem.qntInStock &&
reserve
) {
reservedItem.reservedBy.push(user);
reservedItem.reservedStack += 1;
user.reservedItems.push(reservedItem);
} else if (reservedItem && reservedItem.reservedStack > 0 && !reserve) {
if (!reservedItem.reservedBy.includes(req.userData.userId)) {
const error = new HttpError(
'You have not reserved this item yet.',404
);
return next(error);
}
const userIndex = reservedItem.reservedBy.findindex(
(item) => item.toString() === req.userData.userId.toString()
);
reservedItem.reservedBy.splice(userIndex,1);
reservedItem.reservedStack -= 1;
const itemIndex = user.reservedItems.findindex(
(item) => item.toString() === itemId.toString()
);
user.reservedItems.splice(itemIndex,1);
}
await storage.save({ session: sess });
await user.save({ session: sess });
await sess.commitTransaction();
res.status(200).json({ storage: storage.toObject({ getters: true }) });
} catch (err) {
const error = new HttpError(
'Reserving item Failed,500
);
return next(error);
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。