所以,基本上,我正在做一些博客工作,而且,由于我是关于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'])的帖子。怎么解决?
答案 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
}
])
聚合管道中的每个步骤都是:
我不熟悉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代码段能够正常工作。