2017-05-16 17 views
1

検索をしましたが、どういう仕組みが必要なのか分かりません。.NETでMongoDBにPHPを挿入したデータを読む

mongo C#ドライバは、タイプを格納するために_tを使用しています。逆シリアル化すると、使用するサブクラスを知ることができますが、PHPなどで同じDBを使用したい場合、どのように動作するかを理解しようとしています。プログラミング言語。

このタイプのため、デシリアライズが不可能になるのではないかと恐れています。誰かが私にこのすべての仕組みを説明できれば、私はウェブ上で回答を得ようとしましたが、まだ部分的です。ただ、答えにこれを入れて

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

多分私は誤解します。 MongoはバイナリJSONであるBSONを保存/転送します。コンテキスト自体がJSONであることを意味します。 JSONの逆シリアル化は、オブジェクトのテキスト表現であるため、どの言語でも行うことができます。 C#は静的型付けされた言語ですが、あなたは「動的」として逆シリアル化できますが、それは良くありません。 '_t'フィールドは、Mongoの逆シリアル化ライブラリが変換されたオブジェクトを知ることができるように(つまり、継承されたクラス' FooBar:Foo'を持っている場合、ドライバはオブジェクトを 'Foo'または –

+0

これは私には正当なようだが、私は友人とこれについて論じてきたし、同じ解説を思いついた。あなたが言ったように、 _tはC言語では役に立ちますが、他の言語では、あなたが言ったように、jsonのデシリアライゼーションはどの言語でも起こりうるので、私はそれを理解しようとしていますが、最終的にはPHPでそれを作ることができます。 –

答えて

1

:ここ

は、私は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のないレコードを別の言語で挿入している場合は、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

あなたが書いたPHP関数は、例えば、C#の統合からデータをシリアル化しないようにすることができますか?私が理解すれば、fooは私の_tになります。 –

+1

変数が混ざっていましたか?バーは適切だったC#オブジェクトに名前があるので、一致するように更新しました。オブジェクト内で提供される '_t'を使用すると、異なる言語で何を翻訳するのかを理解するのに役立ちます。それはどのようにすればいいのですか?しかし、少なくともC#では、ドライバがデータ・ドキュメントにどのプロパティを関連付けるべきかという難解なロジックを実行させることができます。また、各プロパティの名前、無視するもの、必要なものなどを具体的に記述できるアノテーションもあります。https://blog.oz-code.com/how-to-mongodb-in-c-パート1/ –

+0

私はそれを手に入れます!このようにして、シリアライゼーションとデシリアライゼーションの両方がc# –

関連する問題