MongoDB 2.2.2 での開発で、6 か月間 readOnly=false 管理者ユーザーでアプリケーションを実行してきました。ローンチが近づいてきたので、アプリケーションを実行するユーザーを、アプリケーションのデータベース内の readOnly=false のみのユーザーに切り替えたいと思いました。
管理者ユーザーとして robomongo から次のスクリプトを実行しました。
use MyDB
db.addUser("api", "MyPassword", {"readOnly": false});
また、MongoDB 接続文字列を次のように更新しました。
<add key="DataServer" value="mongodb://api:MyPassword@localhost:27017/MyDB" />
ユーザーが正しく作成され、それが MyDB にあり、readOnly=false であることを検証しました。ただし、MongoDB c# ドライバー 1.8.1 を使用すると、WriteConcernException の許可されていない書き込みで失敗します。データベースからレコードを問題なく読み取ることができます。MongoDB ログを見ると、C# アプリケーションから DB に正しくログインしていますが、書き込み呼び出しに失敗しています。
robomongo シェルを使用して、api ユーザーで正常に認証し、アプリケーションの DB 内のコレクションの 1 つにレコードを書き込むことができました。そのため、これは c# ドライバーに関係していると思われます。また、アプリケーション コードをデバッグし、MongoClient の GetServer メソッドが正しい資格情報を持つ MongoServer を返すことを検証しました。
これは、ユーザーが DB に書き込めることを検証するために実行した robomongo シェル スクリプトです。
use MyDB
db.auth("api","MyPassword");
db.Person.insert({"first_name":"Test","last_name":"User"});
db.Person.find({"first_name":"Test"});
MongoDB c# 1.8.1 ドライバーが MongoDB 2.2.2 に接続し、readOnly=false ユーザーでユーザー DB にレコードを書き込めない理由についての助けをいただければ幸いです。