1

PHP と Javascript を使用する MongoDB で問題が発生しています。

1) ドキュメントをコレクションに書き出し、そこにあることを確認します。

{
  "_id": ObjectId("500d9f072d854e2001000018"),
  "field1": "happenstance",
  "mydata": "balls  grinders",
  "desc": "johnsig"

}

2) JavaScript を使用して、php プログラムを呼び出してコレクションからレコードをフェッチします。

function fetch(){
    $.ajax({
        url: "sbugger.php",
    dataType: "json",
    data: "mode=fetch",
    success: function(data){        
        record = data;
    }
});

}

3) 「desc」要素を変更し、php プログラムに戻してドキュメントを保存します。

function save(){
record.desc=" HELLO THERE FELLA";
jString = encodeURIComponent(JSON.stringify(record));
myData =  "mode=save&record="+jString;
url = "sbugger.php";

$.ajax({
    url: url,
    type: 'POST',
    data: myData,
    success: function(data){
        document.write(data);
        }   });

} 

PHP側のコードは次のとおりです。

 $stuff = json_decode($_REQUEST["record"],true);  
 $collection->save($stuff);

 var_dump($stuff);
 var_dump($db->lastError()); 

$id を変更しなかったので、これは単にレコードをその場で更新するだけだと思います。

代わりに、次の var_dump を取得します。

  object(stdClass)[4]
  public '_id' => 
    object(stdClass)[5]
  public '$id' => string '500d9f072d854e2001000018' (length=24)
  public 'field1' => string 'happenstance' (length=12)
  public 'mydata' => string 'balls  grinders' (length=15)
  public 'desc' => string ' HELLO THERE FELLA' (length=18)

そしてこのlastErrorメッセージ

配列 'err' => 文字列 '無効な演算子: $id' (長さ = 21) 'code' => int 10068 'n' => int 0 'lastOp' => object(MongoTimestamp)[8] public 'sec' = > int 1343070014 public 'inc' => int 1 'connectionId' => int 56143 'ok' => float 1

私はこれで1.5日間頭を壁にぶつけています。

MongoDB の専門家が助けてくれますか?

PS私がphpプログラムだけにとどまっている場合、検索と保存は完全に機能します。json をやり取りするときに問題があるようです。

4

1 に答える 1

0

Mongo ドキュメントを PHP から JSON に、またはその逆に変換すると、_idフィールドの型情報が失われます。MongoDB のネイティブ BSON では、これはobject IDです。PHP はMongoIdオブジェクトと同じ型を表し、Mongo の JS シェルは ObjectId クラスを使用します。純粋な JSON にはクラス情報がないため、これは文字列を唯一の$idプロパティとして持つオブジェクトとして表されます。表示されたエラー メッセージは$id、 がクエリ演算子として解釈されているためです。

これにより ID フィールドが作成されましたが、他の BSON タイプ (日付、タイムスタンプ、正規表現パターンなど) を処理する場合、同じようにタイプ情報が失われることが予想されます。これをすぐに解決するには、フィールドを PHP ドライバーが提供するクラスに手動で変換します。

あるいは、ドキュメント全体を書き戻す理由はまったくないと思います。モデル属性の変更検出を提供する backbone.js を調査することをお勧めします。これにより、フロントエンドでドキュメントをモデル化し、サーバーに送り返されるデータを最小限に抑え、$setMongo でドキュメントを更新するときにアトミック更新 (操作) を利用できます。

于 2012-07-24T15:07:55.163 に答える