从scala将文档插入mongodb时出错

时间:2010-09-17 14:50:25

标签: scala mongodb

尝试从scala插入mongodb数据库。以下代码不创建数据库或集合。尝试使用默认测试数据库。我该如何执行CRUD操作?

object Store {
      def main(args: Array[String]) = {
        def addMongo(): Unit = {
          var mongo = new Mongo()
          var db = mongo.getDB("mybd")
          var coll = db.getCollection("somecollection")
          var obj = new BasicDBObject()
      obj.put("name", "Mongo")
      obj.put("type", "db")
      coll.insert(obj)
      coll.save(obj)
      println("Saved") //to print to console
        }
    }

2 个答案:

答案 0 :(得分:6)

乍一看,代码中的内容看起来还不错,尽管顶部有一个迷路的def addMongo(): Unit = { 代码。我会推迟在这里寻找错误的建议......两个注意事项:

1)save()insert()是互补操作 - 您只需要一个。 insert()将始终尝试创建新文档... save()如果未设置_id字段,则会创建一个,如果有,则更新代表的_id

2)默认情况下,Mongo客户端不等待写操作的答案。这是非常可能的&可能是MongoDB中发生错误导致您的写入失败。 getLastError()命令将返回当前连接上最后一次写操作的结果。因为MongoDB的Java驱动程序使用连接池,所以必须告诉它在您想要“安全”运行的操作期间将您锁定到单个连接上(例如检查结果)。这是Java驱动程序中最简单的方法(在Scala中,尽管是示例代码):

   mongo.requestStart() // lock the connection in
   coll.insert(obj) // attempt the insert
   getLastError.throwOnError() // This tells the getLastError command to throw an exception in case of an error
   mongo.requestDone() // release the connection lock

看看这个优秀的writeup on MongoDB's Write Durability,它专注于Java驱动程序。

您可能还想查看包含Java驱动程序的Scala driver I maintain (Casbah)并提供更多scala功能。

我们在安全()中提供了安全写入概念的执行方法版本,这使得测试写入成功变得更加容易。

答案 1 :(得分:4)

您错过了addMongo中的main来电。修复是微不足道的:

object Store {
  def main(args: Array[String]) = {
    def addMongo(): Unit = {
      var mongo = new Mongo()
      var db = mongo.getDB("mybd")
      var coll = db.getCollection("somecollection")
      var obj = new BasicDBObject()
      obj.put("name", "Mongo")
      obj.put("type", "db")
      coll.insert(obj)
      coll.save(obj)
      println("Saved") //to print to console
    }

    addMongo // call it!
}