gpt4 book ai didi

javascript - 根据文档中数组元素的值和文档本身的 _id 更新文档

转载 作者:搜寻专家 更新时间:2023-11-01 00:35:43 26 4
gpt4 key购买 nike

如问题所述,我无法使此更新操作正常工作。

我的场景:

我有一个Event、一个Ticket 和一个TicketPurchaseEventTicketPurchase 具有 Ticket 数组作为属性。

我需要达到的目标:

  1. TicketPurchase 的票证数组中特定 Ticketvalidated 属性从真/假更新。

  2. 在主 Event 表中将同一票的 total_quantity 属性从 1 开始递减。(TicketPurchase 中的所有票是主 Event 表中门票的副本)

作为一名程序员,我几乎所有的经验都花在了 MySQL 上,所以我在 NoSQL 世界中仍然是一个初学者。

我尝试过的:

  1. Checked the docs
  2. 花了一些时间在 S/O 和 this 上事实证明这是最相关的答案,但我无法使该解决方案发挥作用。
  3. 交换了我对 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'}
});

事件.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.';
}


}

最佳答案

首先,这是一个简短的示例,说明如何避免循环并仅使用 mongoose 方法完成所有操作:

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 填充了它的 ticket 对象,而不仅仅是 id 对象。

除此之外,您似乎不必更新事件模式中的票证,因为您可以直接在票证模式中执行此操作(就像我在示例开销中所做的那样),因为所有引用最终都指向它们的对象模式。

关于javascript - 根据文档中数组元素的值和文档本身的 _id 更新文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52877075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com