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

时间:2018-10-18 15:04:55

标签: javascript node.js mongoose

问题表明,我无法使此更新操作正常工作。

我的情况:

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

我需要实现的目标:

  1. 从true / false更新validated的票证数组中特定Ticket的{​​{1}}属性。

  2. 从主TicketPurchase表中的1.开始减少同一票证的total_quantity属性。(Event中的所有票证都是主{{ 1}}表)

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

我尝试过的事情:

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

});

1 个答案:

答案 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模式中进行票证(就像我在示例示例中所做的那样),因为所有引用最终都指向它们中的对象模式。