2014-09-02 1 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 объясненном & идентификатор = 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); 

ли не очень многое сделать что-нибудь, как ни странно, это должно работать, не так ли?

-Third решение:

$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'] в сыром виде, поэтому он не вытащить что-нибудь из массива. Ура! –

 Смежные вопросы

  • Нет связанных вопросов^_^