0

これはサンプルコードです:

  $r = $coll->findOne();
  $coll->remove(array("_id"=>$r["_id"]));  // use the same object id as retreived from DB
  $ret=$coll->findOne(array("_id"=>($r["_id"])));
  var_dump($ret);  // dumps the records that was supposed to be deleted

コレクション内のレコードには、文字列ではなく、MongoDB objectId があります。コンソールで同じロジックが正常に機能し、レコードが正しく削除されました。

4

3 に答える 3

2

これは私のために働いています。コードは次のとおりです。

$coll->drop();
print("Now have ".$coll->count()." items\n");

$coll->insert(array("x" => 'blah'));
$coll->insert(array("x" => "blahblah"));
print("Inserted ".$coll->count()." items\n");

$x = $coll->findOne();
print("Object X\n");
print_r($x);
$query_x = array('_id' => $x['_id']);
$coll->remove($query_x);
print("Removed 1 item, now have ".$coll->count()." items\n");

$y = $coll->findOne($query_x);
print("Object Y\n");
print_r($y);

出力は次のとおりです。

Now have 0 items
Inserted 2 items
Object X
Array
(
    [_id] => MongoId Object
        (
            [$id] => 4d8d124b6803fa623b000000
        )

    [x] => blah
)
Removed 1 item, now have 1 items
Object Y

どこかにタイプミスはありませんか?

于 2011-03-25T22:10:43.260 に答える
0

PHP は緩やかに型付けされているため、すべての入力値と検索値を期待される一貫性のあるデータ型にキャストすることが最も重要です。そうしないと、期待するドキュメントが見つからないことは間違いありません。

PHP 内で MongoDB を使用するときは、混乱やエラーの可能性を避けるために、すべてを意図的にキャストするようにしています。

また、groups.google.com の mongodb-user グループは非常に優れた応答性を備えているため、そのリソースをまだ利用していない場合は、ぜひ参加を検討してください。

于 2011-06-06T20:54:26.040 に答える
0

php == 演算子とは異なり、mongo の等値演算子は常に「オブジェクト等値」を使用します。これは、php の同一比較演算子 (===) や Java の .equals() に似ています。あなたのコードは正常に動作するように見えますが (テスト データセットでは問題なく動作します)、データセットに関する何かが原因で、php が返された MongoId を文字列にキャストしている可能性があります。 MongoId の詳細については、こちらをご覧ください

クエリ自体の var_dump を実行して、クエリが比較のために MongoId を提供していることを確認してください。また、最新バージョンの PHP Mongo ドライバーを実行していることを確認してください。

于 2011-03-26T14:12:18.973 に答える