批量更新Mongoose数据

10

我正在使用node和mongoose从一个RETS(XML)源中提取数据并将其保存到本地的MongoDB中。

周期性地,我需要更新文档并删除不活动的文档以及添加新文档。为了避免对Mongo或RETS服务器进行多次查询,我同时获取它们并循环遍历数据。

这种方法虽然有效,但是否有一种方法可以将Mongoose的结果保存回数据库并进行更新和插入操作呢?还是说我需要找到每个文档并逐个更新它们?

2个回答

13

在MongoDB中,使用Mongoose更新多个文档(而不仅仅是一个)可以使用multi选项:

Model.updateMany({ 
  size: 'lage'
}, { 
  $set: { size: 'large' }
});

欲了解更多,请参阅 Mongoose 文档中有关更新文档在此处的信息。


但我将要处理数百甚至数千个文档。批量更新是否可行? - jabbermonkey
是的,您可以使用{ multi: true }选项。如此处所述。 - Gianfranco P.
如何批量更新字段?例如 ex-users.email、users.address、users.first 等。在这种情况下,我有一个 users 对象。我不想逐个列出每个字段。我想要类似 {$set: {"users.$.": users}} 这样的东西。 - Vikas Chauhan
@VikasChauhan 好的,你需要指定要将电子邮件更新到哪个用户,对吧?还是你想让所有用户的电子邮件、地址等都相同? - Gianfranco P.
1
@GianfrancoP,这仅适用于单个用户,我在条件中指定了。 如果我正在更新单个列{$set:{'users。$ .field':fieldvalue}},那么它完全正常工作,但是当存在多个值时,在这种情况下它无法正常工作。 但我找到了解决方法。 谢谢 - Vikas Chauhan
@zeion 这是一个单一的函数。Moongoose现在支持Promises。因此,如果您await update()函数并且不传递回调函数,则它将按预期工作。https://mongoosejs.com/docs/documents.html#updating - Gianfranco P.

7

为了完整起见,如果有多个查询条件,并且希望为每个匹配查询条件的文档添加新字段,则可以使用

var bulk = Person.collection.initializeUnorderedBulkOp();
bulk.find(query1).update(update1);
bulk.find(query2).update(update2);
bulk.execute(callback);

在以下文档中提到,db.collection.initializeUnorderedBulkOp()
初始化并返回集合的新Bulk()操作构造器。该构建器构造一个无序写操作列表,MongoDB会批量执行。MongoDB以并行方式执行列表中的写入操作。 https://docs.mongodb.org/v3.0/reference/method/db.collection.initializeUnorderedBulkOp/

在更新中,您如何引用正在更新的文档? - greymatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接