sql >> データベース >  >> NoSQL >> MongoDB

Dictionary をBSONにシリアル化するときのBsonSerializationException

    問題は、新しいドライバーがデフォルトで辞書をドキュメントとしてシリアル化することです。

    MongoDB C#ドライバーには、辞書をシリアル化する3つの方法があります。DocumentArrayOfArraysArrayOfDocuments (詳細については、ドキュメントを参照してください)。ドキュメントとしてシリアル化する場合、辞書キーはBSON要素の名前ですが、いくつかの制限があります(たとえば、エラーが示すように、文字列としてシリアル化する必要があります)。

    この場合、辞書のキーはDateTimeです。 文字列としてではなく、Dateとしてシリアル化される sしたがって、別のDictionaryRepresentationを選択する必要があります 。

    この特定のプロパティのシリアル化を変更するには、BsonDictionaryOptionsを使用できます。 DictionaryRepresentationが異なる属性 :

    [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]
    public Dictionary<DateTime, int> Dictionary { get; private set; }
    

    ただし、問題のあるすべてのメンバーに対して個別にそれを行う必要があります。このDictionaryRepresentationを適用するには 関連するすべてのメンバーに、新しい規則を実装できます:

    class DictionaryRepresentationConvention : ConventionBase, IMemberMapConvention
    {
        private readonly DictionaryRepresentation _dictionaryRepresentation;
        public DictionaryRepresentationConvention(DictionaryRepresentation dictionaryRepresentation)
        {
            _dictionaryRepresentation = dictionaryRepresentation;
        }
        public void Apply(BsonMemberMap memberMap)
        {
            memberMap.SetSerializer(ConfigureSerializer(memberMap.GetSerializer()));
        }
        private IBsonSerializer ConfigureSerializer(IBsonSerializer serializer)
        {
            var dictionaryRepresentationConfigurable = serializer as IDictionaryRepresentationConfigurable;
            if (dictionaryRepresentationConfigurable != null)
            {
                serializer = dictionaryRepresentationConfigurable.WithDictionaryRepresentation(_dictionaryRepresentation);
            }
    
            var childSerializerConfigurable = serializer as IChildSerializerConfigurable;
            return childSerializerConfigurable == null
                ? serializer
                : childSerializerConfigurable.WithChildSerializer(ConfigureSerializer(childSerializerConfigurable.ChildSerializer));
        }
    } 
    

    次のように登録します:

    ConventionRegistry.Register(
        "DictionaryRepresentationConvention",
        new ConventionPack {new DictionaryRepresentationConvention(DictionaryRepresentation.ArrayOfArrays)},
        _ => true);
    


    1. MongooseのMulterを使用してMongoDBにファイルを保存する

    2. C#でMongoDBネストされた$elemMatchクエリを実装する方法

    3. すべてのMongoコレクションをループして、クエリを実行します

    4. エラー:タイプパラメータ `D`は、一部のローカルタイプのタイプパラメータとして使用する必要があります