2012-02-26 19 views
14

現在、mongoDBとnodeJSを使用して登録フォームを作成しようとしています - 新しいデータベースとコレクションを作成しました - username、password、emailとinsert_timeを私のデータベース。MongoDBへのデータの挿入 - エラーなし、挿入なし

username/emailに一意のインデックスを追加し、動作しているかどうかを確認しました。mongoのコンソールやrockmongo(php mongodb manager)を使用して重複したエントリを追加することはできません。

しかし、新しいアカウントを登録する予定のコードが実行されていて、既にデータベースに入っているデータを挿入すると、追加されるはずだったすべてのデータを含むオブジェクトが返されます新しい一意のIDで要点は、エントリを複製することができず、挿入が失敗したと言うエラーを返すべきです。代わりにデータを返し、新しい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); 
     } 
    }); 
} 

- 新しいデータを挿入し、どのような方法でデータベースを変更しない重複したデータを挿入する - ERRORがnullと保存されています挿入されるはずのデータのコピーです。挿入が行われたかどうかを確認する方法はありますか?また、挿入前または挿入後に手動でデータがデータベースに存在するかどうかを確認する必要がありますか?

答えて

10

このようにMongoは機能します。 saveコマンドを発行するときにsafeオプションを使用してエラーを戻したいと伝える必要があります(デフォルトでは「fire and forget」メソッドが使用されます)。

https://docs.mongodb.com/manual/reference/command/getLastError/

+3

"セーフ:true"を "保存"機能に追加すると、私の問題が解決しました。ありがとう。 – biphobe

1

これは基本的にMongoDB unique index does not workと同じ問題ですが、JavaではなくJavaScript APIを使用しています。つまり、「セーフ」フラグを指定せずに保存するか、最後のエラー値を明示的にチェックするのは安全ではありません。IDはクライアント側で生成され、コマンドはディスパッチされますが、(例:ユニークなインデックス違反のため)明示的に最後のエラーステータスを取得する必要があります。

http://www.mongodb.org/display/DOCS/dbshell+Reference#dbshellReference-ErrorCheckingは、コマンドシェルを使用してdb.getLastError()を示唆しています。ノードAPIは、可能であればどこでも同じであると仮定します。

+0

db.getLastErrorを使用した場合コンソール)(任意の値を返さない - 私はモンゴにエラーを保存していないことを推測する - しかし、私は言ったように - それは私が重複したエントリを挿入することはできません - 私はそれをnodeJSを使ってのみ行うことができます。 – biphobe

関連する問題