MongoDB findOne()查询博客帖子文档中的数组

时间:2014-08-30 19:37:58

标签: php mongodb

所以,基本上,我正在做一些博客工作,而且,由于我是关于MongoDB的新手,我无法为此构建正确的查询。我只想为发布后的目的做一个简单的单独页面。所以,通过游标,我设法使用foreach()循环并列出所有注释,我还设法创建了工作的后提交表单,会话管理器等等。这是交易,我无法为单个帖子版本构建正确的查询。在我的PHP文件中,有一个指向编辑页面的锚点,它使用它的注释ID,同样:

 <a href="edit.php?id=<?php echo $comment["_id"]; ?>"> edit </a>

它通过特定帖子的ID指向第二页,在该页面中我无法匹配正确的findOne()查询。它总是找到一个NULL值。我想要做的是找到这个特定的帖子,并将其放入textarea供用户编辑,然后重新发布。这很简单,但我很难搞清楚。我阅读了MongoDB文档,但找不到令我满意的任何内容。另一件事是MongoDB不是最流行的,社区不像MySQLi那么庞大。

这是我在集合中的帖子文档:

{
    "_id" : "css-clearfix-explained",
    "title" : "CSS Clearfix Explained",
    "comments" : [ 
        {
            "_id" : ObjectId("53ff7ad2af105b0c0b3c9869"),
            "comment" : " some comment",
            "author" : "maciejsitko",
            "date" : ISODate("2014-08-28T18:54:10.569Z")
        }, 
        {
            "_id" : ObjectId("53ff7ae8af105b080b3c986a"),
            "comment" : "some comment 2",
            "author" : "maciejsitko",
            "date" : ISODate("2014-08-28T18:54:32.670Z")
        }, 
        {
            "_id" : ObjectId("53ff851baf105b370b3c9869"),
            "comment" : "some comment 3",
            "author" : "maciejsitko",
            "date" : ISODate("2014-08-28T19:38:03.710Z")
        }, 
        {
            "_id" : ObjectId("53ff8589af105b3f0b3c986b"),
            "comment" : "some comment 4",
            "author" : "maciejsitko",
            "date" : ISODate("2014-08-28T19:39:53.220Z")
        }, 
        {
            "_id" : ObjectId("53ff8599af105b0c0b3c986a"),
            "comment" : "some comment 5",
            "author" : "drummond",
            "date" : ISODate("2014-08-28T19:40:09.149Z")
        }, 
        {
            "_id" : ObjectId("5400b5f3af105b750b3c9869"),
            "comment" : "skdjfksfjksdfj",
            "author" : "maciejsitko",
            "date" : ISODate("2014-08-29T17:18:43.671Z")
        }
    ]
}

我真的需要在“comments”数组中找到一个带有正确的“_id”(使用$ _GET ['id'])的帖子。怎么解决?

1 个答案:

答案 0 :(得分:1)

您尝试实现的结果无法使用“findOne”完成。相反,您需要使用Mongo DB聚合。

基本上,Mongo数据库查询如下所示:

db.collection.aggregate([
    $match:{
        "_id": [id of the post document]
    },
    $unwind:"$comments",
    $match:{
        "comments._id": [id of the comment within the comments array (i.e. GET param)]
    },
    $project:{
        "comments":1
    }
])

聚合管道中的每个步骤都是:

  1. 通过 _id 字段查找帖子文档。
  2. 通过展平其注释数组来对帖子文档进行非规范化。这会在管道中产生一个子结果,其中包含帖子文档中每个评论的一个文档。
  3. 通过 comment._id 字段找到与我们所寻求的评论相对应的子文档。
  4. 投放此子结果文档的评论字段,其中包含您所寻求的评论。
  5. 我不熟悉PHP,但我试图使用手册here在PHP中编写这种聚合。下面是聚合管道,用PHP编写:

    $ops = array(    
        array(
            '$match' => array(
                "_id" => [id for the post document]
            ),
        ),
        array('$unwind' => '$comments'),
        array(
            '$match' => array(
                "comments._id" => [id for the comment within the comments array (i.e. GET param)]
            ),
        ),
        array(
            '$project' => array(
                "comments" => 1
            ),
        ),
    );
    $results = $c->aggregate($ops);
    

    查询应该为您提供所需的结果,我希望PHP代码段能够正常工作。