2011-12-21 16 views
4

公式のC#ドライバを使ってmongodbに新しい文書を挿入した後、生成された_idを直ちに読み戻して他のコレクションの「外部」キーとして使用する方法を教えてください。私はSQL Serverで私はすぐに新しく挿入された行のID列の値を読み取ることができます知っているので、私はmongodbで同様の機能が必要です。公式のC#ドライバを使用して挿入した後、mongoから自動生成されたIDを読み取る方法は?

mongoによって生成された_idが実際のオブジェクトのメンバーではないため、汎用のbsondocumentで何かする必要があるとしますか?

答えて

0

MongoDBでは、idは(通常)クライアント側で生成されます。また、適切なドライバーコールを使用して自分自身を生成し、文書に入れて保存することもできます。

私はC#ドライバでは動作しませんでしたが、Rubyドライバはすべて私の仕事をしています。

ruby-1.9.3-p0 :027 > obj = coll.insert({'foo' => 'bar'}) 
=> BSON::ObjectId('4ef15e7f0ed4c00272000001') 
ruby-1.9.3-p0 :030 > coll.find.to_a 
=> [{"_id"=>BSON::ObjectId('4ef15e7f0ed4c00272000001'), "foo"=>"bar"}] 

これは、私はあなたが_idが必要な場合は、それを自分で生成した文書にそれを手動で設定することができる新しいID

ruby-1.9.3-p0 :039 > newid = BSON::ObjectId.new 
=> BSON::ObjectId('4ef15f030ed4c00272000002') 
ruby-1.9.3-p0 :040 > coll.insert({_id: newid, test: 'test'}) 
=> BSON::ObjectId('4ef15f030ed4c00272000002') 
ruby-1.9.3-p0 :041 > coll.find.to_a 
=> [{"_id"=>BSON::ObjectId('4ef15e7f0ed4c00272000001'), "foo"=>"bar"},  {"_id"=>BSON::ObjectId('4ef15f030ed4c00272000002'), "test"=>"test"}] 
0

を作ることができる方法です。

0

ほとんどのドライバでは、_idフィールドは実際にはサーバーに行く前にクライアント側で生成されます。 MongoDBは "自動インクリメント" IDを使用しないので、実際にランダムIDを生成してサーバに伝えることができます"これを使う"

C#ではコードは次のようになります。

var id = ObjectId.GenerateNewId(); 

ですから、BSONドキュメントを作成し、単純にそれを保存することができます:

var toSave = new BsonDocument { 
    { "_id", ObjectId.GenerateNewId() }, 
    { "data", "my data" } 
}; 
db.collection.Save(toSave); 

ただし、デフォルトでは、ときに.Save()ドキュメントこの意志_idフィールドを更新します。だから一般的には、BSONDocumentまたはBSONSerializableクラス)を保存してからそれを読み返すことができます。

「外部キー」の実装を簡素化するのに役立つDBRefという仕様があります。ドキュメントはhereですが、C#ではDBRefクラスを見てください。

2

findAndModifyコマンドでupsertを実行すると、独自のIDを生成するよりも少ない労力で同じ効果を得ることができます。 (なぜなら、10genが使用されていると判断された非常に良い理由があります - これは簡単にシャーディングを可能にします)

findAndModifyコマンドを使用すると、ドキュメントを検索してアップセットすることができますその同じ文書

次のように一般的な形式は次のとおりです。

db.runCommand({ findAndModify : <collection>, <options> }) 

あなたはそれhereについての詳細を読むことができます。

upsertオプションに加えてnewを使用して、新しく作成したオブジェクトを返すことができます。

0

他の回答と同様に、IDはクライアント側に割り当てられます。あなたができることは、まだ設定されていなければ、挿入中に新しいIDを生成するデフォルト値規約を作成することです。

public class DefaultValueConvention : MongoDB.Bson.Serialization.Conventions.IDefaultValueConvention 
{ 
    public object GetDefaultValue(MemberInfo memberInfo) 
    { 
     var type = memberInfo.MemberType == MemberTypes.Property 
         ? ((PropertyInfo) memberInfo).PropertyType 
         : ((FieldInfo) memberInfo).FieldType; 

     if (type.IsSubclassOf(typeof(ObjectId))) 
      return ObjectId.GenerateNewId(); 
     else 
      return null; 
    } 
} 

とセットアップこの規則を使用するドライバ:

var profile = new ConventionProfile(); 
profile.SetDefaultValueConvention(new DefaultValueConvention()); 
BsonClassMap.RegisterConventions(profile, x => x.FullName.StartsWith("ConsoleApplication")); 

だから今、あなたは&は2行でそれを持続オブジェクトを作成することができます最新で、実際に

var animal = new Animal {Name = "Monkey", PercentDeviationFromHumans = 2.01}; 
db["animals"].Save(animal); 

をあなたはデフォルト値の規約を設定する必要はありません、それはすでにこの動作OOTBを持っています。いずれにしても、慣習はmongoでは十分に活用されていない。

関連する問題