1

私は MongoLabs api を使用して生活を簡素化しようとしてきましたが、ほとんどの場合、php と curl を使用してデータベースに更新をプッシュしようとするまでは機能していましたが、サイコロはありません。私のコードはこれに似ています:

$data_string = json_encode('{"user.userEmail": "USER_EMAIL", "user.pass":"USER_PASS"}');
try { 
$ch = curl_init();

//need to create temp file to pass to curl to use PUT
$tempFile = fopen('php://temp/maxmemory:256000', 'w');
if (!$tempFile) {
    die('could not open temp memory data');
}
fwrite($tempFile, $data_string);
fseek($tempFile, 0); 

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
//curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
//curl_setopt($ch, CURLOPT_INFILE, $tempFile); // file pointer

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, DB_API_REQUEST_TIMEOUT);                                                                    
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                     
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                       
    'Content-Length: ' . strlen($data_string),
    )                                                                              
);   

$cache = curl_exec($ch);
curl_close($ch);
} catch (Exception $e) {
    return FALSE;
}

私の問題は、MongoLab の API にあるようです。コード ビットは完璧に機能しますが、labs は、渡すデータが 'Invalid object{ "user.firstName" :"Pablo","user.newsletter":"true"}: フィールドに格納されていることを通知するという事実を除いて、 db を持つことはできません。それらの中で。ファイルを渡してポストフィールドを使用しようとしましたが、どちらも機能しませんでした。

firefox の Poster プラグインでテストすると、値は正常に機能します。誰かが MongoLabs のことをよりよく理解しているなら、私はいくらかの啓発が大好きです. 前もって感謝します!

4

2 に答える 2

6

フィールド名からドットを削除する必要があります。次のようなスキーマに移動してみてください。

{ "user": { "userEmail": "USER_EMAIL", "pass": "USER_PASS" } }

残念ながら、MongoDB はフィールド名でのドットの使用をサポートしていません。これは、クエリ言語がドットを演算子として使用して、ネストされたフィールド名を連鎖させるためです。MongoDB でフィールド名にドットを使用できるようにすると、何らかのエスケープ メカニズムがなければ、ドット クエリがあいまいになります。

このドキュメントが合法である場合:

{ "bow.ties": "uncool", "bow": { "ties": "cool" } }

このクエリはあいまいです。

{ "bow.ties": "cool" }

ドキュメントが一致するかどうかは不明です。フィールド「bow.ties」またはフィールド「bow」の値内にネストされたフィールド「ties」のことですか?

これらのアイデアを示す mongo シェル セッションのキャプチャを次に示します。

% mongo
MongoDB shell version: 2.1.1
connecting to: test
> db.stuff.save({"bow.ties":"uncool"})
Wed Jul 18 11:17:59 uncaught exception: can't have . in field names [bow.ties]
> db.stuff.save({"bow":{"ties":"cool"}})
> db.stuff.find({"bow.ties":"cool"})
{ "_id" : ObjectId("5006ff3f1348197bacb458f7"), "bow" : { "ties" : "cool" } }
于 2012-07-18T18:11:27.763 に答える
1

プロジェクトの他の機能をしばらく使用した後、私は自分の間違いに気付き、最終的に混乱の原因になりました。

curl PUT は、モディファイア操作を MongoDB に送信することを目的としていました。私はすべてのデータを JSON として送信していましたが、PHP で使用するためにデコードを中断し、その一部を再エンコードして送り返していました。したがって、受信した元のデータは次のようになります。

{"userEmail":"p@g.com","pass":"****", "$oid":"5555", "$set":{"user.firstName":"Pablo","user.newsletter":"true"}}

問題は、「$ set」オブジェクトの値を (php で) 取得し{"user.firstName":"Pablo","user.newsletter":"true"}、演算子なしで値のみを再エンコード"$set"し、それを送信してエラーが発生したことでした。この場合、送信する適切な文字列は{"$set":{"user.firstName":"Pablo","user.newsletter":"true"}}

これは単純な間違いですが、次に誰かがこのようなことをして無効なオブジェクト エラーが発生したときに、幸運にもこれを見つけられることを願っています。

于 2012-07-20T13:29:21.423 に答える