由于我的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检查。
可以使用任何建议。谢谢!
答案 0 :(得分: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,我提供了这个简单的两步操作。
首先,找到包含数组的所有文档并取消设置这些数组。这将留下空值代替它们。注意,它只匹配并更新文档中的第一个数组。如果有多个,则需要重复操作
> 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 ] }