mongodb为入门最佳实践PHP添加评论

时间:2012-09-19 17:26:10

标签: php mongodb

我正在尝试将条目添加到mongodb中 这就是我到目前为止所拥有的

$mongo = new Mongo();
$db = $mongo->comedy;
$collection = $db->cartoons;
$obj = array( 
    "title" => "football", array('comment' => 'my comment here'),
    "author" => "joe" 
);

$collection->insert($obj);

产生此条目

{
 "_id": ObjectId("5059fd31ba76883414000001"),
 "title": "football",
 "0": {
     "comment": "my comment here"
},
 "author": "joe"
}   

我的问题这是在“足球”条目下嵌套评论的最佳方式吗?或者我应该以不同的方式进行讨论?

这部分似乎不正确

"0": {
     "comment": "my comment here"
}

更新
从下面的示例中,运行此操作会出现错误Fatal error: Call to undefined method MongoDB::update()

$mongo = new Mongo();
$db = $mongo->comedy;
$collection = $db->cartoons;

$mongo->comedy->update(array('title' => 'football'), array(
        '$push' => array('comments' => array('content' => 'Yo!', 'author' => $user_id))
));

然后当我像

一样运行它
$mongo = new Mongo();
$db = $mongo->comedy;
$collection = $db->cartoons;
$obj = array(
    '$set' => array("title" => "football", "author" => "joe"), 
    '$push' => array('comments' => array('content' => 'Yo!'))
);

我得到了

{
 "_id": ObjectId("505a2493ba76883c08000007"),
 "title": "football",
 "0": {
     "$push": {
         "comments": {
             "content": "Yo!"
        }
    }
},
 "author": "joe"
}   

1 个答案:

答案 0 :(得分:2)

这是MongoDB中一个非常典型的问题,作为一个菜鸟,它让我在这里有一个很好的结构(你可以谷歌这个):

{
    title: footbal,
    comments: [
        {content: '', author: ObjectId()},
        { // Next comment }
    ]
}

然后,您可以$push到评论字段,使所有评论从最新到的排序 最古老的。

请注意:您可能会发现此架构对其查询可能性有点限制,特别是当您希望实时地以不同方式对注释进行排序或选择不同类型的注释时。在这种情况下,您可以使用单独的集合来理想地存储注释。

修改

在PHP中,您可以从插入文档开始:

$mongo = new Mongo();
$db = $mongo->comedy;
$collection = $db->cartoons;
$obj = array( "title" => "football");
$collection->insert($obj);

然后当需要添加新评论时,只需简单地推送:

$mongo->comedy->update(array('title' => 'football'), array(
    '$push' => array('comments' => array('content' => 'Yo!', 'author' => $user_id))
));

这就是这样做的简单方法:)

再次编辑

$obj = array('$set' => array("title" => "football", "author" => "joe"), '$push' => array('comments' => array('content' => 'Yo!'))));