在处理mongodb时,我应该何时在查询中使用{safe:true}?
现在我使用'safe'选项来检查我的查询是否已成功插入或更新。但是,我觉得这可能会过度杀人。
我应该假设99%的时间,我的查询(假设它们写得正确)将被插入/更新,而不必担心检查它们是否成功输入?
想法?
答案 0 :(得分:26)
假设你说的查询实际上意味着写/插入(你的问题的措辞让我想到这一点)那么写关注(安全,无,fsync等)可以用来获得更快的速度和更少的安全性如果有必要,可以接受,速度更快,更安全。
作为一个例子,一个假设的Facebook风格的应用程序可以使用不安全的写入“喜欢”,而它会使用非常安全的写入密码更改。这背后的逻辑是,一秒钟内会发生数千次“赞”式更新,如果丢失则无关紧要,而密码更新的发生次数较少,但必须成功。
因此,请根据您的速度和数据完整性要求,尝试根据您所做的更新来定制Write Concern选项。
答案 1 :(得分: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()
如果此块成功而没有异常,则成功插入所有数据。如果存在异常,则一个或多个写入操作失败,您将需要重试它们(或检查唯一索引违规等)。在现实生活中,您可能每10次写入左右调用getLastError,以避免重新提交大量请求。
在执行大量数据的批量插入时,此模式非常适合性能。
答案 2 :(得分:2)
只有在写入时才需要安全,而不是读取。查询只是读取。