使用php更新mongodb中的嵌入文档

时间:2012-07-29 06:50:26

标签: php mongodb

我正在创建一个博客网站,所以我使用MongoDB作为我的数据库。在我的收藏“文章”中,我有1个名为帖子的嵌入式文档,我想再插入1个嵌入式文档。评论。

DB:

  {
    "_id": ObjectId("4f41a5c7c32810e404000000"),
    "username":"abc",
    "posts": [
    {
        "_id": 1,
        "content": "dskcnkdcnksldcnskcd",
        "title" : "test1"
    },
    {"_id": 2,
        "content": "dskcsdsl;d,cl;sdcl;sdmcnkdcnksldcnskcd",
        "title" : "test2"
    },
   ]
}

我想在帖子中插入评论。

 {
    "_id": ObjectId("4f41a5c7c32810e404000000"),
    "username":"abc",
    "posts": [
    {
        "_id": 1,
        "content": "dskcnkdcnksldcnskcd",
        "title" : "test1",
     "comments":[
    {
      "content": "usdhcjsdcjskd",
      "by" : "abc"
    }
    ]
    },
    {"_id": 2,
        "content": "dskcsdsl;d,cl;sdcl;sdmcnkdcnksldcnskcd",
        "title" : "test2"
    }
   ]
}

2 个答案:

答案 0 :(得分:3)

评论实际上是文档中帖子的嵌入式文档,因此您需要稍微更改一下查询:

$collection->update(array('_id' => new MongoId($bid),'posts.id'=> $pid),array('$push' => array('posts.$.comments' => $comment)));

试试。

注意我是如何使用位置运算符的?您可以在此处详细了解:http://www.mongodb.org/display/DOCS/Updating/#Updating-The%24positionaloperator

答案 1 :(得分:0)

您需要注意的是第一次插入的结构。例如,你有一些用户有一些列表,你想让他最多有5个列表。这就是你用PHP做的方法:

  1. 如果您的本地主机服务器上的PHP环境中没有mongodb扩展,则需要安装它;

  2. 您需要安装mongodb并运行它。

  3. 完成所有这些后,您可以轻松地执行此操作:

    $m = new Mongo("mongodb://localhost");
    $db = $m->statistic->list;
    
    // statistic is my database and list are collection.
    
    $list =
            array(
                '_id' => 18,
                'lists' =>
                array(
                    array(
                        'name' => 'Magento and PHP developer',
                        'recipients' =>
                        array(
                            'name' => 'Kristijan Glibo',
                            'email' => 'glibo.kristijan@gmail.com'
                        ),
                        'count' => 12345),
            ));
    

    你可以在这里看到我使用了一些(int)18作为我的_id。如果你没有指定它,Mongo将生成它。我这样使用它只是为了测试目的。请注意,列表 数组,其中的每个列表也都是数组,并且拥有自己的数据!我的列表 Magento和PHP开发人员包含有关收件人和计数的数据。收件人也有一些独特的数据。

    让我们首先插入我们的Mongodb:

    $document = $db->insert($list);
    

    如果我们现在转储集合以查看我们在其中保存的内容,我们将得到这个:

    注意:要获取您的收藏及其中的所有内容,您可以使用以下代码:

    $documents = $db->find();
    echo '<pre>';
    foreach ($documents as $doc) {
        var_dump($doc);
    }die();
    

    ********************这是转储数据******************* < /强>

    ["_id"]=>
      int(18)
      ["lists"]=>
      array(3) {
        [0]=>
        array(3) {
          ["name"]=>
          string(10) "Magento and PHP developer"
          ["recipients"]=>
          array(2) {
            ["name"]=>
            string(4) "Kristijan Glibo"
            ["email"]=>
            string(25) "glibo.kristijan@gmail.com"
          }
          ["count"]=>
          int(12345)
        }
    

    现在让我们更新用户并为他添加更多列表:

    $updatelist = array('name' => 'updatelist', 'recipients' => array(),'count'=>2876);
    $documentupdate = $db->
    update(
    array('_id'=>18),
    array('$addToSet' => array('lists'=> $updatelist)));
    

    你告诉他哪个对象要通过selectin _id =&gt;进行更新18以及如何更新。我测试了它,如果该列表不存在,它将添加新列表。如果存在,它将跳过它。

    希望这有帮助!