2014-09-02 3 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 포스트 = & ID를 CSS-clearfix-설명 = 540617e3af105b8d133c986a (두 변수 '게시물을 얻을 참조로 '와'ID ') 나는 몇 가지 솔루션을 시도

,

- 첫째 하나

$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); 

꽤 많이 오른쪽이 작동합니다, 이상하게도, 아무 짓도 안 했어요?

- 제 3 해결책 :

$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 값으로 캐스팅해야합니다.이 값은 PHP에서 MongoId 클래스로 캐스팅 할 수 있습니다.

+0

고맙습니다. 위에서 여러 번 열거 한 솔루션을 시도했지만 새로운 MongoId() 표시기를 쓰는 것을 잊어 버렸습니다. 대신 $ _GET [ 'id']를 원시 형식으로 두었습니다. 배열에서 무엇이든 꺼내십시오. 건배! –

관련 문제