正如问题所指出的,我无法使此更新操作正常工作。
我的情况:
我有一个Event
,一个Ticket
和一个TicketPurchase
。的Event
和TicketPurchase
具有Ticket
阵列作为属性。
我需要实现的目标:
从true / false更新票证数组中validated
特定项的属性。Ticket
TicketPurchase
total_quantity
从主Event
表中的1.减少同一票证的属性。(aTicketPurchase
中的所有票证都是主Event
表中票证的副本)
我几乎所有的程序员经验都花在了MySQL上,所以我仍然是NoSQL领域的初学者。
我试过的
id
和的用法_id
,使运算符像$set
在''标记之内和之外,以及所有其他类似的配置,什么也不会给出。ticket.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'}
});
event.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}
});
ticketPurchase.js
const TicketPurchaseSchema = new Schema({
user: {type: Schema.Types.ObjectId, ref: 'User'},
event: {type: Schema.Types.ObjectId, ref: 'Event'},
tickets: [{type: Schema.Types.ObjectId, ref: 'Ticket'}],
time_stamp: {type: Date}
});
update.js
for(var x of ticketPurchase.tickets){
//console.log(x);
if(x.id === ticket_id && x.validated === 'false'){
console.log('ticket not validated. Update');
TicketPurchase.update(
{_id: ticket_purchase_id, 'tickets._id': ticket_id},
{'$set':{
'tickets.$.validated': 'true'
}},
function (err){
console.log('updated validated');
if(err){console.log(err);}
}
);
Event
.update({_id: event_id, "tickets._id": x.id},
{$inc : {"tickets.$.total_quantity" : -1}});
console.log('updated ticket.total_qty');
payload['success'] = 'true';
}else if(x.id === ticket_id && x.validated === 'true'){
console.log('ticket validated');
payload['success'] = 'false';
payload['message'] = 'Ticket already validated.';
}
}
首先,这是一个简短的示例,说明如何避免循环并仅使用猫鼬方法进行所有操作:
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对象。
除此之外,您似乎不必更新事件架构中的票证,因为您可以直接在票证架构中进行更新(就像我在示例开销中所做的那样),因为所有引用最终都指向架构中的对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句