现在,我的收藏中有一个文档,我想在点击时删除,这些是帖子文档中的评论。
这是结构:
{
"_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 (正如你看到两个变量'post'和'id')
我尝试了几种解决方案,
- 第一个:
$collection->update( array("_id" => $_GET['post']), array( '$unset' =>
array("comments" => array("_id" => $_GET['id']))) );
这个删除了我在评论数组中的所有注释。
-Second:
$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']));
实现这一目标的正确方法是什么?我经常在这个问题上挣扎,甚至实现了一些聚合查询,但它没有成功。
答案 0 :(得分:3)
要从数组中删除元素,请使用$pull
运算符。这需要一个“查询”表达式来标识您要删除的元素:
$collection->update(
array("_id" => $_GET['post']),
array( '$pull' =>
array(
"comments" => array(
"_id" => new MongoId( $_GET['id'] )
)
)
)
);
$pull
的“查询”部分作用于指定数组的各个元素,因此将从数组中删除与条件匹配的任何内容。但同样重要的是,您的请求参数是一个“字符串”,因此您需要将其转换为实际的ObjectId
值,您可以使用驱动程序中的MongoId类在PHP中进行转换。
注意 Modern driver releases使用
MongoDB\BSON\ObjectId
作为将“字符串十六进制值”转换为实际ObjectId
表示形式的正确方法。