2012-05-12 29 views
-1

由於我的PHP腳本中存在一個錯誤,我在MongoDB中創建了多個錯誤的條目。具體來說,我用$ addToSet和$每在某些情況下,MongoDB的對象被如下錯誤更新:有沒有辦法檢查一個數組條目是否包含MongoDB中的子數組?

array (
    '_id' => new MongoId("4fa4f815a6a54cedde000000"), 
    'poster' => '[email protected]', 
    'image' => 
    array (
    '0' => 'image1.jpg', 
    '1' => 'image2.jpg', 
    '2' => 'image3.png', 
    '3' => 
    array (
     '$each' => NULL, 
    ), 
), 

你可以看到「image.3」是從其他數組項不同,那是不正確的條目。我已經修復了我的PHP腳本中的相關內容,但是我很難追蹤MongoDB中所有受影響的條目以刪除這些條目。

有什麼辦法在MongoDB中檢查是否有任何圖像數組條目包含另一個數組而不是字符串?由於包含子數組的索引是一個變量,因此不可能在image.3上對每個條目執行$ type檢查。

可以使用任何建議。謝謝!

回答

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 ] } 
+0

謝謝!這對我有效。但是,由於某種原因,我不得不使用$ type:3而不是$ type:4,因爲$ type:4與預期的不匹配任何文檔。 – blacklotus

相關問題