2010-09-17 43 views
3

嘗試從scala插入到mongodb數據庫。下面的代碼不會創建一個數據庫或集合。也嘗試使用默認的測試分貝。我如何執行CRUD操作?從scala插入文件到mongodb時出錯

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 
     } 
    } 
+1

嘗試使用casbah,scala的官方驅動程序,它很容易做到所有這些與ti – swordfish 2011-07-25 05:00:59

回答

6

乍一看,儘管代碼頂部有那些零散的代碼,但代碼在代碼中看起來還不錯。我會推遲在這裏尋找錯誤的建議....兩項注意事項:

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驅動程序特別關注。

您可能還想看看Scala driver I maintain (Casbah),它包裝了Java驅動程序並提供了更多的scala功能。

我們在safe()中提供了安全寫入概念的執行周邊版本,這使得測試寫入成功變得更容易。

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! 
}