2014-09-02 48 views
0

現在,我的收藏中有一個文檔,我希望在點擊時刪除,而這些文檔是註釋文檔中的註釋。MongoDB/PHP刪除文檔中的特定數組項目

這裏的結構:

{ 
    "_id" : "design-patterns-vs-frameworks", 
    "title" : "Design Patterns vs Frameworks", 
    "category" : [ 
     "Frameworks", 
     " Design Patterns", 
     " PHP" 
    ], 
    "date_time" : ISODate("2014-09-02T13:45:29.124Z"), 
    "description" : "Frameworks vs Design Patterns", 
    "content" : " Content!", 
    "author" : "Maciej Sitko", 
    "comments" : [ 
     { 
      "_id" : ObjectId("54061528af105b51133c986c"), 
      "comment" : "ashfklsfsl\r\n", 
      "author" : "maciejsitko", 
      "date" : ISODate("2014-09-02T19:06:16.646Z") 
     }, 
     { 
      "_id" : ObjectId("5406152caf105b51133c986d"), 
      "comment" : "lfasdlfsfl", 
      "author" : "maciejsitko", 
      "date" : ISODate("2014-09-02T19:06:20.652Z") 
     } 
    ] 
} 

完整的刪除鏈接是:

delete.php後= CSS-clearfix解釋的& ID = 540617e3af105b8d133c986a (正如你看到兩個GET變量「後'和 '身份證')

我嘗試了幾種解決方案,

- 首先一個:

$collection->update(array("_id" => $_GET['post']), array('$unset' => 
array("comments" => array("_id" => $_GET['id'])))); 

這只是刪除評論數組內的所有評論。

- 第二:

$delete = array('$pull' => array("comments" => array('_id' => $_GET['id']))); 
$collection->update(array('_id' => $_GET['post']), $delete); 

沒有幾乎做任何事情,奇怪的是,這應該工作,對不對?

- 第三解決方案:

$collection->remove(array('_id' => $_GET['post'], 'comments._id' => $_GET['id'])); 

什麼將是實現這一目標的正確方法?我在這個問題上掙扎很多,甚至實現了一些聚合查詢,但沒有成功。

回答

2

要從陣列中刪除元素,請使用$pull運算符。這需要一個「查詢」表達來識別要刪除的元素:

$collection->update( 
    array("_id" => $_GET['post']), 
    array('$pull' => 
     array(
      "comments" => array(
       "_id" => new MongoId($_GET['id']) 
      ) 
     ) 
    ) 
); 

$pull作用於指定所述陣列的各個元件的「查詢」部分,所以任何相匹配的條件將從被去除陣列。但重要的是,您的請求參數是一個「字符串」,因此您需要將其作爲實際值ObjectId進行投票,您可以使用驅動程序中的MongoId類以PHP形式投射該值。

+0

謝謝你,我嘗試了你上面列出的幾次解決方案,但忘了放一個新的MongoId()指標,相反,我只是以原始方式放置$ _GET ['id'],所以它沒有從數組中拉出任何東西。乾杯! – 2014-09-03 12:14:12