问题表明,我无法使此更新操作正常工作。
我的情况:
我有一个Event
,一个Ticket
和一个TicketPurchase
。 Event
和TicketPurchase
具有Ticket
数组作为属性。
我需要实现的目标:
从true / false更新validated
的票证数组中特定Ticket
的{{1}}属性。
从主TicketPurchase
表中的1.开始减少同一票证的total_quantity
属性。(Event
中的所有票证都是主{{ 1}}表)
我几乎所有的程序员经验都花在了MySQL上,所以我仍然是NoSQL世界的初学者。
我尝试过的事情:
TicketPurchase
和Event
的用法,将id
之类的运算符放入和移出了''标记,以及所有其他类似的配置,什么都不会给出。ticket.js
_id
event.js
$set
ticketPurchase.js
const TicketSchema = new Schema({
type : {type: String},
total_quantity : {type: Number},
price : {type: String},
limit_per_order: {type: Number},
start_date: {type: Date},
end_date: {type: Date},
description: {type: String},
validated: {type: String, default: 'false'}
});
update.js
const EventSchema = new Schema({
title: {type: String},
location: {type: String},
start_date: {type: Date},
start_time: {type: String},
end_date: {type: Date},
end_time: {type: String},
description: {type: String},
organizer_name: {type: String},
organizer_about: {type: String},
cover_picture: {type: String},
tickets: [{type: Schema.Types.ObjectId, ref: 'Ticket'}],
access_code: {type: String, default: shortid.generate}
});
答案 0 :(得分:3)
首先,这是一个简短的示例,说明如何避免循环并仅使用猫鼬方法进行所有操作:
TicketPurchase.findById(purchaseId, (err, ticketPurchase) => {
Ticket.update({ _id: { $in: ticketPurchase.tickets }, _id: ticket_id, validated: 'false' },
{ $set: { validated: 'true' }, $inc: { total_quantity: -1 } },
(err, outcome) => {
console.log(`The number of validated tickets for the Purchase #${purchaseId} is ${outcome.nModified}`);
});
});
在此它以相同的操作进行所有操作:找到属于该购买且尚未验证的票证,此后将验证的属性设置为'true'并减少数量。最后,您将获得已修改记录的总数。
在您的示例中,我看不到您已在purchaseTicket中填充票证。要以您编写的方式遍历票证对象,由于属性ticketPurchase.tickets
仅包含引用,因此您不得不为其父实体填充票证对象。该表达式看起来像:TicketPurchase.findById(purchaseId).populate('tickets').then(purchase => { ... })
purchase
的属性tickets
充满了其票证对象,而不仅仅是id对象。
此外,您似乎不必更新Event模式中的票证,因为您可以直接在Ticket模式中进行票证(就像我在示例示例中所做的那样),因为所有引用最终都指向它们中的对象模式。