我使用Doctrine ODM来处理MongoDB。我有要保存的文档,这些文档会重复出现。我只需要每个事件的1个副本,所以我使用哈希唯一键来确保事件只有1个。
所以我执行几个 ->persist($document); 然后当我执行 ->flush(); 时,会出现异常: localhost:27017:E11000重复键错误索引:dbname.event.$eventKey_1 dup key:{: "keyValue"}
所有数据都未保存到MongoDB。所以问题是:是否有任何方法可以持久化唯一数据并忽略现有数据而不执行以下操作?
所以我执行几个 ->persist($document); 然后当我执行 ->flush(); 时,会出现异常: localhost:27017:E11000重复键错误索引:dbname.event.$eventKey_1 dup key:{: "keyValue"}
所有数据都未保存到MongoDB。所以问题是:是否有任何方法可以持久化唯一数据并忽略现有数据而不执行以下操作?
try {
->persist();
->flush();
} catch (\Exception $e) {}
每个文档都是如何处理的?
谢谢。
更新: 感谢您的回答和时间,但我已经找到确切的解决方案 :)
Mongo函数insert有一个选项"ordered:" https://docs.mongodb.org/manual/reference/method/db.collection.insert/ 它允许在出现错误后继续插入。
Doctrine使用Pecl扩展来操作Mongo。 doctrine flush()使用的是这个方法: http://www.php.net/manual/en/mongocollection.batchinsert.php 它有一个选项"continueOnError"
所以如果你按照这种方式做:
$documentManager->flush(null, ['continueOnError' => true]);
它将保存所有文档而不出现错误,并跳过所有带有错误的文档。虽然它会抛出 "\MongoDuplicateKeyException" 异常。所以你需要做的就是捕获这个异常并处理或者简单地忽略它(取决于你的需求)。
就像这样 :)