2013-04-10 18 views
4

我將生JSON成收集和發現什麼是存儲在數據庫中缺少值。例如,我的收藏是BsonDocuments的集合:JObject.ToBsonDocument落下值

_products = database.GetCollection<BsonDocument>("products"); 

插入JSON到集合代碼:

public int AddProductDetails(JObject json) 
    { 
     BsonDocument doc = json.ToBsonDocument(DictionarySerializationOptions.Document); 
     _products.Insert(doc); 
    } 

是在外觀還是通過這樣的JSON:

{ 「ID」:1, 「標籤」: 「書」, 「數據庫」 ], 「名稱」: 「書名」, 「價格」:1 2.12 }

但是,什麼是集合中的堅持只是沒有值的屬性。

{ 
"_id": { 
    "$oid": "5165c7e10fdb8c09f446d720" 
}, 
"Id": [], 
"Tags": [ 
    [], 
    [] 
], 
"Name": [], 
"Price": []} 

爲什麼值被丟棄?

回答

11

這做什麼我所期待的。

public int AddProductDetails(JObject json) 
    { 
     BsonDocument doc = BsonDocument.Parse(json.ToString()); 
     _products.Insert(doc); 
    } 
+1

您應該將此標記爲答案(即使它是您自己的),因爲它似乎也解決了我的問題。謝謝! – GShenanigan 2014-01-28 15:33:25

+0

太棒了!這是我正在尋找的。 – tyrion 2016-06-03 12:47:27

+2

這很好,但是有更高效的版本[3年]?複製到字符串可能是一個'昂貴'的大型JSON操作? – 2016-12-05 13:52:14

1

您是否嘗試過使用BsonSerializer?

using MongoDB.Bson.Serialization; 
[...] 
var document = BsonSerializer.Deserialize<BsonDocument>(json); 

BsonSerializer適用於字符串,所以如果JSON參數是JObject(或JArray,JRaw等),你有JsonConvert.SerializeObject以序列化()

+0

無法編譯。這樣做,但生成相同的結果.var doc = BsonSerializer.Deserialize (json.ToBsonDocument()); – 2013-04-10 21:01:19

+0

編譯這個時出錯? – 2013-04-10 21:03:04

+0

參數1:無法從「Newtonsoft.Json.Linq.JObject」到「MongoDB.Bson.BsonDocument」 – 2013-04-10 21:22:49

4

我遇到了這個問題,當我有一個類型爲JObject的屬性的C#類。

我的解決方案是創建JObjectSerializer爲MondoDB的屬性添加到屬性,以便蒙戈串行使用它。我假設如果我努力嘗試,我可以在Mongo中註冊下面的Serializer作爲這種類型的全局串行器。

[BsonSerializer(typeof(Serializers.JObjectSerializer))] 
public JObject AdditionalData { get; set; } 


    namespace Serializers 
{ 
    public class JObjectSerializer : SerializerBase<Newtonsoft.Json.Linq.JObject> // : IBsonSerializer<Newtonsoft.Json.Linq.JObject> 
    { 

     public override Newtonsoft.Json.Linq.JObject Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) 
     { 
      MongoDB.Bson.BsonDocument myBSONDoc = BsonDocumentSerializer.Instance.Deserialize(context); 
      return Newtonsoft.Json.Linq.JObject.Parse(myBSONDoc.ToString()); 
     } 
     public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, Newtonsoft.Json.Linq.JObject value) 
     {    
      MongoDB.Bson.BsonDocument myBSONDoc = MongoDB.Bson.BsonDocument.Parse(value.ToString()); 
      BsonDocumentSerializer.Instance.Serialize(context,myBSONDoc); 
     } 
    } 
}