-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,我提供了这个简单的两步操作。

首先,找到所有包含数组的文档并取消设置这些数组。这将留下空值代替它们。注意,它只会匹配和更新文档中的第一个数组。如果有多个,要重复操作

> 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 回答