-1

PHP スクリプトのバグが原因で、MongoDB に複数の誤ったエントリを作成してしまいました。具体的には、$addToSet と $each を使用していましたが、特定の状況下では、MongoDB オブジェクトが次のように間違って更新されます。

array (
  '_id' => new MongoId("4fa4f815a6a54cedde000000"),
  'poster' => 'alex@randommail.com',
  'image' => 
  array (
    '0' => 'image1.jpg',
    '1' => 'image2.jpg',
    '2' => 'image3.png',
    '3' => 
    array (
      '$each' => NULL,
    ),
  ),

「image.3」は他の配列エントリとは異なり、間違ったエントリであることがわかります。関連する PHP スクリプトを修正しましたが、MongoDB で影響を受けるすべてのエントリを追跡してそのようなエントリを削除するのは困難です。

MongoDB で画像配列エントリのいずれかに文字列ではなく別の配列が含まれているかどうかを確認する方法はありますか? サブ配列を含むインデックスは変数であるため、すべてのエントリに対して image.3 で $type チェックを実行することはできません。

任意の提案を使用できます。ありがとう!

4

1 に答える 1

2

これは PHP のエラーだったので、エラーのあるすべてのドキュメントをアップグレードする必要があると思います。

もしそうなら、配列アイテムが配列自体であるすべてのドキュメントを見つけることができます。

> db.arr.insert({values: [1, 2, 3, [4, 5]]})
> db.arr.insert({values: [6, 7, 8]})
> 
> db.arr.find({values: {$type: 4}})
{ "_id" : ObjectId("4fae0750d59332f28c702618"), "values" : [ 1, 2, 3, [ 4, 5 ] ] }

これを修正しましょう。このようなエントリを PHP にフェッチせずに削除するには、この単純な 2 ステップの操作を提供します。

まず、配列を持つすべてのドキュメントを見つけて、それらの配列の設定を解除します。これにより、代わりにヌルが残ります。ドキュメント内の最初の配列のみが一致して更新されることに注意してください。複数ある場合は操作を繰り返したい

> db.arr.update({values: {$type: 4}}, {$unset: {'values.$': 1}}, false, true);
> db.arr.find()
{ "_id" : ObjectId("4fae0750d59332f28c702618"), "values" : [ 1, 2, 3, null ] }

ヌルを削除します。

> db.arr.update({values: null}, {$pull: {values: null}}, false, true);
> db.arr.find()
{ "_id" : ObjectId("4fae0750d59332f28c702618"), "values" : [ 1, 2, 3 ] }
于 2012-05-12T06:48:18.067 に答える