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

比格兹

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

我的情况:

我有一个Event,一个Ticket和一个TicketPurchaseEventTicketPurchase具有Ticket阵列作为属性。

我需要实现的目标:

  1. 从true / false更新票证数组中validated特定项属性TicketTicketPurchase

  2. total_quantity从主Event表中的1.减少同一票证属性。(aTicketPurchase中的所有票证都是主Event中票证的副本

我几乎所有的程序员经验都花在了MySQL上,所以我仍然是NoSQL领域的初学者。

我试过的

  1. 检查了文档
  2. 花了一些时间在S / O上,被证明是最相关的答案,但是我无法使该解决方案起作用。
  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'}
});

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


   }
奥列格·萨法罗夫(Oleg Safarov)

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

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章