1

MongoDB ネイティブ JS ドライバーと、固有の制約が与えられた挿入について少し混乱しています。ここhttp://mongodb.github.com/node-mongodb-native/api-articles/nodekoarticle1.htmlを読むと、挿入後、保存されたドキュメントを処理できる「成功」コールバックを渡すことができるようです (おそらくたとえば、保存されたドキュメントから _id フィールドを取得します)。

しかし、それぞれに電子メール フィールドがあるユーザー プロファイルを保存するとします。電子メール フィールドを一意にしたいので、ensureIndex を使用する必要があると考えています。次に、それぞれに電子メール フィールドがある 10 個のユーザー プロファイルをバッチ挿入したいとしますが、それらの 10 個の電子メールのうち 2 個は既にデータベースに存在します。一意の制約により、これら 2 つのユーザー プロファイルはデータベースに追加されませんよね? では、コールバックには何が返されるのでしょうか? 8つの保存されたドキュメント? または 8 つの保存されたドキュメントと 2 つの既存のドキュメント?

編集:少しテストした後、私はいくつかの良い進歩を遂げましたが、まだ1つ欠けています. 上記の例を続けて説明します。1 つのドキュメントを含むユーザー プロファイルのコレクションがあり、そのドキュメントに "email": "ex@mple.com" のフィールドがあるとします。次に、このコレクションの email フィールドに { unique: true } のインデックスを付けたとします。次に、単純な挿入を実行すると:

collection.insert({ 'email': 'ex@mple.com' }, { safe: true }, function (err, results) {
    console.log(results);                                                         
});

上記のコールバックは未定義で返されます。これは、その電子メールを含むドキュメントが既に存在し、挿入が実行されなかったためです。それは十分に理にかなっていますが、私が望むのは、新しい挿入を妨げた既存のドキュメントを含む「結果」​​が返されることです。それは可能ですか?

4

1 に答える 1

-1
> db.collection.find()
{ "_id" : 1, email : "email" }
> db.collection.ensureIndex({email: 1}, {unique: true})
> db.collection.insert({_id:2, email: "email"})
E11000 duplicate key error index: foo.collection.$email_1  dup key: { : "email" }

重複キー エラー メッセージ「E11000 duplicate key...」を解析して「email」を取得し、続いて find() を発行して、挿入を妨げた既存のドキュメントを取得できますか?

ドキュメントは 1 つしかないため、db.collection.find(email: "email")

于 2012-10-11T19:07:10.827 に答える