当前位置: 首页 > 知识库问答 >
问题:

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

东方嘉木
2023-03-14

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

我的设想:

我有一个事件、一个票证和一个票证采购事件TicketPurchase具有Ticket数组作为属性。

我需要达到的目标是:

>

将同一票据的total_quantity属性从1递减。在主事件表中。(TicketPurchase中的所有票证都是主事件表中票证的副本)

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

我所尝试的:

  1. 检查文档

票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}

});

购票。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}

});

使现代化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.';
                }


   }

共有1个答案

宫俊才
2023-03-14

首先,这里是一个简短的示例,说明了如何避免循环,并仅使用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。票证仅包含引用。表达式看起来像:TicketPurchase。findById(purchaseId)。填充('tickets')。然后(购买=

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

 类似资料:
  • 我想统计一下每分钟存储的新文档数量。 由于带有标准ObjectID的_id字段已经包含文档创建的时间戳,我认为应该可以以某种方式使用它。 在Stackoverflow上,我发现了以下映射缩减代码,以便在创建数据有专用字段时完成它 地图-减少每分钟的文档数MongoDB 根据Mongo DB文档(http://docs.mongodb.org/manual/reference/object-id/)

  • 我有一份这样的文件: 我想通过将其与数量字段(2*800)相乘来更新价格字段,其中的结果将更新/分配给价格。(对于本例,价格更新为1600)。 更新后的文档: 我的选择查询如下: 我怎样才能做到这一点?

  • 将mongodb与pymongo一起使用,我有以下文档: 我想更新示例子文档(这是一个数组元素,因为可能有多个示例)。我有以下代码,但它不工作... 谁能告诉我这个有什么问题吗?

  • 主要内容:使用XML更新文档使用XML更新文档 以下是用于更新现有文档中的字段的XML文件。将下面的内容保存在名称为的文件中。 正如上面看到的,写入更新数据的XML文件就类似之前用来添加文档的文件。 但唯一的区别是这里使用字段的一个属性。 在这个示例中,我们将使用上述文档并尝试更新为文档的字段。 假设XML文档()存在于Solr的bin目录中。更新的核心是名称为的索引,可以使用工具更新如下 - 执行上述命令后,将得到以下输出

  • 我需要更新Mongo DB中另一个文档内的数组中的一个文档

  • 我对mongodb中的聚合概念相对陌生。在我的文档中,有一个数组。我尝试用$match,$unwind,$group来提取数组中有两个给定值的文档。我猜写上去没什么帮助..这是样品 文件: 从这些文档中,我需要提取一个具有“类:1”和“主题[”物理“,”英语“]的文档 所以,如果我正确地编写了查询(或聚合),我应该从上面提取第二个文档。 这是我所拥有的 好吧,上面的聚合没有给我任何反馈,所以我尝试