:ここ
は、私はMongoDBのとC#で取得する1つのレコード例であるMongoDBはBSON (binary JSON)にデータを格納します。基本的に各レコードをJSON文字列として解釈できるようにします。これはどの言語にもデシリアライズできます。
C#が静的に型付けされていて、何らかの自由形式(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
のないレコードを別の言語で挿入している場合は、BsonDocument
とconduct 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を使用します。
多分私は誤解します。 MongoはバイナリJSONであるBSONを保存/転送します。コンテキスト自体がJSONであることを意味します。 JSONの逆シリアル化は、オブジェクトのテキスト表現であるため、どの言語でも行うことができます。 C#は静的型付けされた言語ですが、あなたは「動的」として逆シリアル化できますが、それは良くありません。 '_t'フィールドは、Mongoの逆シリアル化ライブラリが変換されたオブジェクトを知ることができるように(つまり、継承されたクラス' FooBar:Foo'を持っている場合、ドライバはオブジェクトを 'Foo'または –
これは私には正当なようだが、私は友人とこれについて論じてきたし、同じ解説を思いついた。あなたが言ったように、 _tはC言語では役に立ちますが、他の言語では、あなたが言ったように、jsonのデシリアライゼーションはどの言語でも起こりうるので、私はそれを理解しようとしていますが、最終的にはPHPでそれを作ることができます。 –