2017-01-11 36 views
1

我在我的MongoDB中存儲數據,其中存儲可爲空的int,通常爲null。我在C#端的模型的變量爲int? MaterialID使用MongoDB C#驅動程序將null讀入一個可爲空的int

當我運行.Query.FirstOrDefault()時,出現錯誤「輸入字符串格式不正確」。每當它嘗試讀取Mongo的空值(int都可以正常工作)。

我設法通過改變我的int來解決這個問題?到一個字符串,然後將其轉換回int ?,但這是一個可怕的黑客,我真的不喜歡。任何人有任何想法,我怎麼可以從Mongo讀取null到我的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"。我建議您從修復數據庫中的數據開始。您可以從蒙戈外殼做到這一點:

> 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字段存在。無論如何,你可以根據你的需要調整腳本。

更改字段類型後,映射到可空的int將正常工作。


順便說一句,如果出於某種原因您無法修復數據庫中的數據,還有另一種選擇。你可以使用自定義的BSON序列化器將轉換int?到字符串,反之亦然:

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

謝謝謝爾蓋!我仍然是一個noob Mongo開發者,我一直對NoSQL的靈活性感到困惑。你的修復工作完美。 –

+0

@MicrosoftExcel很好:)順便說一句,我已經添加了一個可以使用的技巧(但在這種情況下修復數據庫更好) –

相關問題