将Mongo升级到3.x; insert不再返回WriteResult

时间:2016-10-19 17:01:59

标签: java mongodb migration

我们正在将Mongo从版本2.x升级到3.x,我的任务是将旧的(Java)代码更新为所有版本的新版本,尝试避免弃用的方法,但试图改变功能尽可能少。我没有写过代码的原始版本。

以下更改让我感到困惑。之前,我们使用DBCollection.insert(args)返回了一个WriteResult对象。现在我们应该使用MongoCollection.insertOne(args),但这不会返回任何内容。是否有另一种方法来生成WriteResult对象?

或者Mongo开发团队认为WriteResult对象不是必需的?我可以看到我们以相当不必要的方式使用它(只是记录)但我不想在没有充分理由的情况下删除它。

以上所有内容也适用于insertMany,我认为它会有相同或相似的答案。

1 个答案:

答案 0 :(得分:1)

insertOne()方法提供了一些优势来处理有问题的情况,其中insert需要一些手动检查,例如

1。)它支持Error Handling意味着您必须在try-catch块中使用插入代码,它可以告诉您,出现了问题(例如为唯一索引插入重复条目),所以请执行其他操作而不是当前的流量。

InsertOne返回

  
      
  • void:表示查询成功完成
  •   
  • 例外:抛出各种异常,表示插入失败的不同原因
  •   
MongoWriteException - if the write failed due some other failure specific to the insert command
MongoWriteConcernException - if the write failed due being unable to fulfill the write concern
MongoException - if the write failed due some other failure

所以你可以简单地添加三个catch块来处理所有插入失败的可能性,如果没有抛出异常,则意味着数据插入成功(无需检查任何内容,快速继续),代码就像

try {
   .. insert query
   }catch(MongoWriteException  e){ .. handle something wrong with query}
    catch(MongoWriteConcernException e){ .. handle something wrong with write-concern}
    catch(MongoException e){ .. handle something else(unknown) went wrong}

咨询:你会得到

  • try-catch良好的做法可以减少代码问题