2017-01-11 13 views
1

MongoDBに、null値を格納するデータがあります。ほとんどの場合ヌルとして格納されます。 C#側の私のモデルはint? MaterialIDという変数を持っています。MongoDB C#ドライバでヌル可能なintにnullを読み込む

.Query.FirstOrDefault()を実行すると、「入力文字列が正しい形式ではありません」というエラーが表示されます。 Mongoからnull値を読み取ろうとするたびに(intsは正常に動作します)。

私はintを変更してこれを回避することができましたか?文字列に変換し、後でそれをint型にキャストしますが、それは本当に好きではない恐ろしいハックです。 Mongoから私のintにヌルをどのように読み込むことができるか、誰でも知っていますか? C#側で?

ありがとうございました。

マイJSON:

"Collection" : { 
 
     "List" : [ 
 
      { 
 
       "ID" : "40", 
 
       "StartDate" : ISODate("2013-01-01T00:00:00.000Z"), 
 
       "EndDate" : ISODate("2013-12-31T00:00:00.000Z"), 
 
       "MaterialID" : "3" 
 
      }, 
 
      { 
 
       "ID" : "40", 
 
       "StartDate" : ISODate("2014-01-01T00:00:00.000Z"), 
 
       "EndDate" : ISODate("2014-09-30T00:00:00.000Z"), 
 
       "MaterialID" : "null" 
 
      } 
 
     ]

+0

このシリアライザを割り当て、あなたのオブジェクトのJSONを投稿することができますか? (nullでないMaterialIdの場合) –

+0

@SergeyBerezovskiy、それを持っています –

+0

文書に_idフィールドがありませんか? –

答えて

1

あなたは、データベース内の文字列としてMaterialIDフィールドを格納している(タイプ2)。もちろん、文字列値をnull可能な整数に代入しようとすると、エラーが発生します。注:nullでも、テキスト"null"の文字列として格納されます。データベース内のデータを修正することをお勧めします。あなたはモンゴシェルからそれを行うことができます。

> db.collection.find({MaterialID:{$type:2}}).forEach(
    function(doc){ 
     var materialId = (doc.MaterialID == "null") ? null : new NumberInt(doc.MaterialID); 
     db.collection.update({_id:doc._id},{$set:{MaterialID: materialId}}); 
    }) 

注:お使いのJSON文書に_idフィールドを持っているが、私はそれが代わりにIDフィールドのあります負いません。とにかく、必要に応じてスクリプトを調整できます。

フィールドタイプを変更すると、nullable intへのマッピングが正しく機能します。


また、何らかの理由でデータベース内のデータを修正できない場合の別のオプションもあります。 intを変換するカスタムBSONシリアライザを使用できますか?文字列とその逆に:

public class NullableIntAsStringSerializer : SerializerBase<int?> 
{ 
    public override void Serialize(
     BsonSerializationContext context, BsonSerializationArgs args, int? value) 
    { 
     context.Writer.WriteString(value.HasValue ? value.ToString() : "null"); 
    } 

    public override int? Deserialize(
     BsonDeserializationContext context, BsonDeserializationArgs args) 
    { 
     var str = context.Reader.ReadString(); 
     return str == "null" ? (int?)null : Int32.Parse(str); 
    } 
} 

そして、あなたの財産

[BsonSerializer(typeof(NullableIntAsStringSerializer))] 
public int? MaterialID { get; set; } 
+1

Sergeyありがとう!私はまだMongoの開発者であり、NoSQLの柔軟性について混乱し続けています。あなたの修正は完全に機能しました。 –

+0

@MicrosoftExcel great :) btwもう1つのトリックを追加しましたが(データベースを修正する方が良い場合があります) –

関連する問題