2016-01-13 7 views
6

objectIdのオブジェクトIDと辞書を含むコレクションを更新したいと思います。c#mongoDb 2.0が辞書に存在しない

public class ME_BlaBla 
{ 
    [BsonId] 
    public ObjectId MyId; 
    public Dictionary<ObjectId, ObjectId> IdsToOtherIds; 
} 

私の名前が有益でない場合は、私は実際のコード=を共有することはできません。だから、イムMyIdフィールドでフィルタしようとしているが、私はそこにデータを挿入したいとき、私はあらゆる種類の重複を望んでいない、いないで

var filter = Builders<ME_BlaBla>.Filter.And(
      Builders<ME_BlaBla>.Filter.Eq(t => t.MyId, id), 
      Builders<ME_BlaBla>.Filter.Not(Builders<ME_BlaBla>.Filter.Exists(t => t.IdsToOtherIds.Values, valueId)), 
      Builders<ME_BlaBla>.Filter.Not(Builders<ME_BlaBla>.Filter.Exists(t => t.IdsToOtherIds.Keys, keyId))); 

は今、私はこのクエリを持っていますKeysValues

全体のアイデアは、更新がアトミックでなければならず、指定されたIDのどちらも辞書に含まれていないことを確認することです。

私はまだここでExistsフィルタの使用方法を理解しようとしています。その答えかもしれません。

TIA。

EDIT

私はそのような何かにコードを変更:(まだわからないその作業は、ATMそれをテストwell..cannot)

Builders<ME_BlaBla>.Filter.Not(Builders<ME_BlaBla>.Filter.ElemMatch(t => t.IdsToOtherIds, a => a.Key == keyId)), 
Builders<ME_BlaBla>.Filter.Not(Builders<ME_BlaBla>.Filter.ElemMatch(t => t.IdsToOtherIds, a => a.Value == valueId))); 
+1

辞書を正しく使用しているかどうかわからないため、テーブルの簡単な説明を共有する必要があります。このフィールドIdsToOtherIdsは正しいとは思われません。 –

+1

コード内にvalueIdとkeyIdとは何ですか?それは何を表していますか?あなたは「キーも値もどちらの値でもない」と言っていますが、シリアライゼーションに基づいて、これはあなたがそこで表現しているものではありません。あなたのシリアライゼーションは、{_id:ObjectId(xxx)、ObjectId(yyyy):ObjectId(zzzz)、ObjectId(yyyy1):ObjectId(zzzz1)、...}のようになります。 –

+0

私はそれをより簡単にする方法を知りません。私は辞書を持っていると想像してください。 辞書にはキーと値があります。私は2つの異なるIDを提供するとき、私はId1が辞書のキーにないようにしたい、そしてid2は辞書の値にないだろう。 ここには何が欠けているのか分かりません。私はデータベースに格納されているクラス全体を提供し、どのような種類のテーブルの説明が不足しているのですか? –

答えて

1
Builders<ME_BlaBla>.Filter.Not(Builders<ME_BlaBla>.Filter.Exists(t => t.IdsToOtherIds.Values, valueId)) 

は、コードのこの部分は、」勝ちましたフィールドDictionaryValuesプロパティ(タイプObjectIdの要素のリスト)にvalueIdの値が存在するかどうかを確認します(これはあなたが意味するものです)。 Existsは、文書に特定のフィールドが含まれているかどうかを確認します。コレクションの文書に「辞書」または「姓」というフィールドがあるかどうかを確認できます。

アプリケーションで一意の値が必要な場合は、シングルトンクラスを作成して特定のシーケンスの次の(したがって一意の)値を生成することができますか?あなたはドキュメントが既にコレクション内に存在するかどうかを確認する必要がある場合は、あなたの代わりにExistsAnyIn(または他の)を使用する必要があるので、

あなたDictionaryは、おそらく、文書の配列として直列化されます。

+0

まあ。私の質問に答えることはできませんが、それは方向を変えます。 基本的に私の問題はユニークなIDを作成または挿入していないことです。 ユーザーに親があると仮定できますか?ユーザーは1つの親しか持つことができません。それらの両方は、それぞれ異なるIDで表されます。 今、私は子供と親を持っています。私はこの親が他人の親ではないことをチェックしたい、そしてまた、その子が他の親の子ではないことをチェックしたい。これらの2つの条件がKeyPairValueを挿入するよりも発生した場合。 –

+0

質問に追加したコードはOKのようですが、それは機能しますか?角括弧の数に基づいて、投稿されたコードの前に 'And'フィルタを追加したと仮定します。 –

+0

私は休暇のために実際にテストすることはできませんが、それはおそらくそれです。そして、はい、編集は、元の投稿のコードの最後の2行を置き換えています –

0

あなたは

https://docs.mongodb.org/manual/reference/operator/query/elemMatch/

歓声、あなたがそのような2組合の基準として、あなたの辞書を使用することができ、あなたの状態では、そのようなあなたの基準に

https://docs.mongodb.org/manual/core/read-operations-introduction/

をネストされたリストのexistanceを見ることができます!

+0

しかし、それは私が私の編集で書いたことはありません?または、ここにsmthがありません –

+0

私はあなたの場合は、最初の辞書を繰り返す必要がありますか、このリンクは別の代替http://stackoverflow.com/questions/20662691/how-to-search-through-a-mongodb-collection- for-dictionary-keys-nested-in-array – dewelloper

+0

私は、辞書の値がこのように扱われる方法を見ています。また、私は本当にMongo systax自体を知っていないので、私はC#mongodbドライバを使用して指示することができれば大変好きです –

関連する問題