mongodb:我应该总是在更新时使用'safe'选项

dez*_*dez 10 database mongodb

在处理mongodb时,我应该何时在查询中使用{safe:true}?

现在我使用'safe'选项来检查我的查询是否已成功插入或更新.但是,我觉得这可能是过度杀戮.

我应该假设99%的时间,我的查询(假设它们写得正确)将被插入/更新,而不必担心检查它们是否成功输入?

想法?

Ric*_*ich 27

假设当你说查询时你实际上意味着写/插入(你的问题的措辞让我想到这一点)那么写关注(安全,无,fsync等)可以用来获得更快的速度和更低的安全性,当这是可以接受的,必要时,速度更快,安全性更高.

例如,一个假设的Facebook风格的应用程序可以使用不安全的"Likes"写入,而它会使用非常安全的写入密码更改.这背后的逻辑是,一秒钟内会发生数千次"喜欢"式的更新,如果丢失了一个并不重要,而密码更新的发生次数较少,但必须成功.

因此,请根据您的速度和数据完整性要求,尝试根据您正在进行的更新来定制Write Concern选项.


Sea*_*lly 6

下面是另一个用例,其中不安全写入是一个合适的选择:您正在以非常短的顺序进行大量写入.在这种情况下,您可能会执行多次写入,然后调用get last error以查看是否有任何失败.

collection.setWriteConcern(WriteConcern.NORMAL)
collection.getDB().resetError()
List<
for (Something data : importData) {
    collection.insert(makeDBObject(data))
}
collection.getDB().getLastError(WriteConcern.REPLICAS_SAFE).throwOnError()
Run Code Online (Sandbox Code Playgroud)

如果此块成功而没有异常,则成功插入所有数据.如果存在异常,则一个或多个写入操作失败,您将需要重试它们(或检查唯一索引违规等).在现实生活中,您可能每10次写入一次调用getLastError,以避免重新提交大量请求.

在执行大量数据的批量插入时,此模式非常适合性能.

  • @Leopd:getLastError等待所有写入完成,然后报告状态. (2认同)