首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MongoDB/PHP删除文档中的特定数组项

MongoDB/PHP删除文档中的特定数组项
EN

Stack Overflow用户
提问于 2014-09-03 03:34:07
回答 1查看 1.8K关注 0票数 0

现在,我的集合中有一个想要在单击时删除的文档,这些文档是post文档中的注释。

结构是这样的:

代码语言:javascript
复制
{
    "_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?post=css-clearfix-explained&id=540617e3af105b8d133c986a (正如您看到的两个get变量'post‘和'id')

我试过几种解决方案,

-First one:

代码语言:javascript
复制
$collection->update( array("_id" => $_GET['post']), array( '$unset' => 
 array("comments" => array("_id" => $_GET['id']))) );

这段代码删除了comments数组中的所有注释。

-Second:

代码语言:javascript
复制
$delete = array('$pull' => array("comments" => array( '_id' => $_GET['id'])));
$collection->update(array('_id' => $_GET['post']), $delete);

几乎没有做任何事情,奇怪的是,这应该是可行的,对吧?

-Third解决方案:

代码语言:javascript
复制
$collection->remove( array('_id' => $_GET['post'], 'comments._id' => $_GET['id']));

实现这一目标的正确方法是什么?我在这一点上挣扎了很多,甚至实现了一些聚合查询,但它不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-03 19:04:12

要从数组中删除元素,可以使用运算符。这需要一个"query“表达式来标识您想要删除的元素:

代码语言:javascript
复制
$collection->update( 
    array("_id" => $_GET['post']),
    array( '$pull' => 
        array(
            "comments" => array(
                "_id" => new MongoId( $_GET['id'] )
            )
        )
    )
);

$pull的"query“部分作用于指定数组的各个元素,因此任何符合条件的元素都将从数组中删除。但同样重要的是,您的请求参数是一个“字符串”,因此您需要将其转换为一个实际的PHP值,您可以使用驱动程序中的MongoId类在ObjectId中转换该值。

NOTE Modern driver releases使用MongoDB\BSON\ObjectId作为将“字符串十六进制值”转换为实际ObjectId表示形式的正确方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25630986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档