2

{"1" : 'value1', "2" : 'value2', "3" : 55}. mongodbコマンドラインを使用してそのようなデータを入力できるようですが、phpを使用してそのようなデータを書き込もうとすると、Message: field names must be stringsエラーが発生します。

http://www.mongodb.org/display/DOCS/Collectionsで mongodb のコレクションの命名について見つけましたが、フィールド名の命名に関する情報は見つかりませんでした。ありがとうございました。

PHPの配列に対してこれを試しました:

$elements[1] = 1;
$index = "2";
settype($index, "string");
$elements[$index] = 2;
$elements["3"] = 3;
var_dump($elements);

そして、次のように表示されます。

array
  1 => int 1
  2 => int 2
  3 => int 3

私が話しているエラーは次のとおりです。

エラーが発生しました アプリケーション エラー 例外情報:

メッセージ: フィールド名は文字列でなければなりません スタック トレース:

#0 C:\library\Shanty\Mongo\Collection.php(376): MongoCollection->find(Array, Array)
#1 C:\git_reps\mailable\application\models\Subscriber1.php(191): Shanty_Mongo_Collection::all(Array, Array)
#2 C:\git_reps\mailable\application\models\Subscriber1.php(203): Model_Subscriber1::getCursor(Array, Array, Array)
#3 C:\git_reps\mailable\application\controllers\ListsController.php(639): Model_Subscriber1::getPaginator(Array, Array, Array)
#4 C:\library\Zend\Controller\Action.php(513): ListsController->view1Action()
#5 C:\library\Zend\Controller\Dispatcher\Standard.php(295): Zend_Controller_Action->dispatch('view1Action')
#6 C:\library\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#7 C:\library\Zend\Application\Bootstrap\Bootstrap.php(97): Zend_Controller_Front->dispatch()
#8 C:\library\Zend\Application.php(366): Zend_Application_Bootstrap_Bootstrap->run()
#9 C:\git_reps\mailable\public\index.php(25): Zend_Application->run()
#10 {main}  

Request Parameters:

array (
  'controller' => 'lists',
  'action' => 'view1',
  'module' => 'default',
  'id' => '52',
)  

「1」のようなmongodb cursuro設定フィールドを取得しようとすると発生します。

4

3 に答える 3

4

私の推測では、数値を文字列として使用している場合、PHP は何らかの自動変換を行っていると思われます。settype ( http://php.net/manual/en/function.settype.php ) を使用して、文字列として設定され、整数に変換されていないことを確認してください。 MongoDB シェル。

于 2012-02-28T15:01:12.513 に答える
3

json ドキュメントを mongodb に保存する場合、命名仕様についてはhttp://www.json.org/を参照する必要があります。そこでのオブジェクトの定義は、キーは文字列でなければならないと言っています。

したがって、数値を文字列としてラップする必要があり、それを属性名として使用できます。

于 2012-02-28T13:38:19.790 に答える
3

PHP ドライバーは、数値のフィールドを返さないように保護することに少し熱心です。幸いなことに、ハッキングすることができます。

したがって、MongoCursor コンストラクターがチェックするため、これは機能しません。

$cursor = $collection->find($criteria, array("2" => 1));

ただし、メソッドにはコンストラクターと同じチェックがないため、これは行われます。fields

$cursor = $collection->find($criteria)->fields(array("2" => 1));

これについてバグを報告しました: https://jira.mongodb.org/browse/PHP-338

(ちなみに、将来、あなたがしていることのより大きなコードサンプルを提供するときに、デバッグに役立ちます。)

于 2012-02-28T21:16:07.383 に答える