2012-02-26 219 views
14

我目前正在嘗試使用mongoDB和nodeJS做一個註冊表單 - 我創建了新的數據庫和集合 - 我想存儲:用戶名,密碼,電子郵件和insert_time在我的數據庫。插入數據到MongoDB - 沒有錯誤,沒有插入

我已經添加了唯一索引到用戶名/電子郵件,並檢查它是否工作 - 我不能使用mongo的控制檯或rockmongo(php mongodb管理器)添加重複的條目 - 因此它工作正常。

但是 - 當應該註冊新帳戶的代碼片段正在執行並且使用已經在數據庫中的數據進行插入時,它會返回一個包含應該添加的所有數據的對象與一個新的,唯一的ID。重點是 - 它應該返回一個錯誤,表明條目不能被複制並且插入失敗 - 而是返回數據並給它一個新的ID。已經駐留在數據庫中的數據保持不變 - 即使ID保持不變 - 它不會被腳本插入返回的新數據重寫。

所以,問題是......我做錯了什麼?或者,也許一切都很好,數據庫的插入應該返回數據,即使它失敗了?...

我甚至嘗試在執行索引之前定義索引。 我嘗試使用mongoDB的默認函數和mongoJS函數插入數據 - 結果在兩種情況下都是相同的。

我想執行(爲mongoJS)代碼:

var dbconn = require("mongojs").connect('127.0.0.1:27017/db', ['users']); 

var register = function(everyone, params, callback) 
{ 
    // TODO: validation 

    dbconn.users.ensureIndex({username:1},{unique:true}); 
    dbconn.users.ensureIndex({email:1},{unique:true}); 

    dbconn.users.save(
    { 
     username: params.username, 
     password: params.password, 
     email: params.email, 
     insert_time: Date.now() 
    }, 
    function(error, saved) 
    { 
     if(error || !saved) 
     { 
      callback(false); 
     } 
     else 
     { 
      console.log(error); 
      console.log(saved); 
      callback(true); 
     } 
    }); 
} 

對於兩種情況 - 插入新的數據並插入不以任何方式修改數據庫的重複數據 - 錯誤爲空並保存只是應該插入的數據的副本。有沒有辦法檢查插入是否被做 - 或者我必須在插入之前/之後檢查數據是否已經存在於數據庫中或者沒有手動檢查?

回答

1

這看起來基本上與MongoDB unique index does not work相同 - 但使用JavaScript API而不是Java。也就是說,在沒有指定「安全」標誌或顯式檢查最後一個錯誤值是不安全的情況下保存---客戶端生成的ID和分派的命令,但它可能仍然失敗(例如,由於唯一索引違反)。您需要明確獲取最後的錯誤狀態。

http://www.mongodb.org/display/DOCS/dbshell+Reference#dbshellReference-ErrorChecking建議使用命令shell的db.getLastError(),我假設節點API是相同的,他們可以這樣做。

+0

使用db.getLastError時,控制檯不返回任何值() - 我猜蒙戈不保存任何錯誤 - 但正如我所說 - 它不會讓我插入重複條目 - 我「可以」只使用nodeJS。 – biphobe 2012-02-26 22:05:33