2012-01-22 27 views
1

私は以下の文書を持っています。C#mongodbフィールド名重複回避策

{ 
    name: 'XYZ', 
    SubscriptionPeriods" : [{ 
     "_id" : null, 
     "PeriodCode" : "1M", 
     "Fee" : "100" 
    }, { 
     "_id" : null, 
     "PeriodCode" : "3M", 
     "Fee" : "300" 
    }] 
} 

管理者はサブスクリプション期間を更新できます。既存の期間を削除したり、同じ更新で新しい期間を追加することができます。最初は、私はこれを、Update(...)のSubscriptionPeriods要素でPullAll(...)とPushAll(...)を実行することで実現できると考えました。しかし、mongodbは更新(...)でフィールドを2回受け入れないことが判明しました。 2つの異なるUpdate(...)でPullAll(...)とPushAll(...)を実行できました。しかし、誰かがPullAll()とPushAll()の間でSubscriptionPeriodsを読み込もうとすると、空のSubscriptionPeriodsが取得され、それは受け入れられないため、私はそのアプローチを採用しませんでした。 私はこれを思いついた。 1つの更新でSubscriptionPeriods1という別の要素を作成し、別の更新でSubscriptionPeriodに名前を変更しました。これは光っているようだ。しかし、私はここで何かを見落としているのだろうかと思っています!私はMongoDBの教祖が私のために持っている可能性のあるコメントを感謝します!

答えて

0

そうです、そうです、ドライバーは同じフィールドで2つの操作を受け付けません。しかし、あなたのケースではもっと簡単な解決策があります。

Update.PullAll("name", ..).PushAll("name", ..)だからあなたは、単に設定した新しい配列の代わりに、古いものを必要とするSet("name", bsonArray)

に等しいです。

+0

ありがとうございました。出来た。実際には、私はSet(...)を試みましたが、 '配列はbsonドキュメントのルートにはありません'というエラーで失敗しました。私はSet( "ArrayElementName"、List .ToBsonDocument())のようなものを使用しました。私は、ToBsonDocument()は、「配列はルートにあることはできません。私はそれを認識せず、Rename(...)で解決する前にさまざまなオプションを試してみました。それにもかかわらず、BsonArrayはSetの2番目の引数として機能します! – user1163459

+0

@ user1163459:ようこそ。 –