2017-05-16 78 views
1

我做了一些搜索,但我無法理解它是如何工作的。使用.NET將數據插入到MongoDB中讀取數據

mongo C#驅動程序正在使用一個_t來存儲類型,所以當我反序列化我可以知道哪些子類使用,但我想了解它是如何工作的,如果我想用PHP或另一個相同的數據庫編程語言。

恐怕會使反序列化不可能因爲那個_t類型。如果有人能夠解釋我是如何工作的,我試圖在網上獲得答案,但它仍然是部分的。

這是一個創紀錄的例子,我用的MongoDB和C#得到:

{ 
    "_id" : "7aafd454629944c3a1a4b6a9c80db677", 
    "_t" : "a-WhereIsFrom", 
    "clickfrom" : "here", 
    "whichwidget" : "none", 
    "Name" : "Franck" 
} 
+1

也許我誤解了。 Mongo存儲/傳輸二進制JSON的BSON。上下文本身就是JSON。 JSON反序列化可以在任何語言中發生,因爲它只是對象的文本表示。 C#是一種靜態類型的語言,雖然可以反序列化爲「動態」,但這並不好。 '_t'字段就是這樣,Mongo反序列化庫可以知道它被翻譯的對象(即,如果你有一個繼承類「FooBar:Foo」,驅動程序知道它是否需要將對象翻譯爲'Foo'或者'FooBar'。你只是試圖理解它是如何工作的? –

+0

是的,這似乎對我來說是合法的,我一直在和一些朋友討論這個問題,並提出了相同的解釋,我想,就像你說的那樣, _t對於C#來說是有用的,但是對於其他語言來說,它可以像你說的那樣工作,因爲json反序列化可以在任何語言中發生,我試圖理解它是如何工作的,但是要最終使用php! –

回答

1

只是爲了把這個答案:MongoDB的存儲在BSON (binary JSON)其數據。基本上允許每個記錄被解釋爲JSON字符串,可以將其解串爲任何語言。它會嘗試將它理解爲一個類型化的對象(除非使用dynamic,但是我之前已經這樣做了,它只是創建了混亂的代碼。)。 )_t字段旨在讓Mongo反序列化程序瞭解它應該將其轉換爲的類型。

考慮:

public class Foo { public string Bar {get;set;} } 
public class FooBar : Foo {} 

如果我讀一個序列化對象,看起來像:

[ 
    { "_t": "Foo", "Bar": "Foo" }, 
    { "_t": "FooBar", "Bar": "Foo" } 
] 

它可以讓圖書館回到你尊重對象的列表。

如果另一種語言插入的記錄沒有_t,您可以拉BsonDocumentconduct your own lookups,但這顯然有點混亂。

翻譯回像PHP,你可以有:

class Foo implements MongoDB\BSON\Serializable 
{ 
    public $bar; 

    public function __construct($bar) 
    { 
     $this->id = new MongoDB\BSON\ObjectID; 
     $this->bar = (string) $bar; 
    } 

    function bsonSerialize() 
    { 
     return [ 
      '_id' => $this->id, 
      'Bar' => $this->bar, 
     ]; 
    } 

    function bsonUnserialize(array $data) 
    { 
     $this->id = $data['_id']; 
     $this->bar = $data['Bar']; 
    } 

}

然後使用TypeMap告訴客戶端什麼的每個對象爲翻譯。

+0

謝謝希望Q/A對其他人有用!你寫的PHP函數可用於例如從c#集成中反序列化數據?所以如果我明白,foo將是我的_t –

+1

如果變量混淆了。「酒吧」是正確的ty名稱在C#對象中,所以我更新了匹配。您可以使用對象中提供的_t來幫助您理解以不同語言翻譯的內容。這完全取決於你如何去做,但至少在C#中,很高興讓司機做出解釋什麼屬性應該與數據文檔關聯的混亂邏輯。還有註釋可以讓你更具體地說明每個屬性的名稱,忽略什麼,需要什麼等。https://blog.oz-code.com/how-to-mongodb-in-c- part-1/ –

+0

我明白了!這樣,序列化和反序列化都可以與c# –

相關問題