0

我正在制作一个博客网站,所以我使用 MongoDB 作为我的数据库。在我的集合“文章”中,我有 1 个名为帖子的嵌入式文档,我想再插入 1 个嵌入式文档。对其发表评论。

D B:

  {
    "_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"
    }
   ]
}
4

2 回答 2

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

于 2012-07-29T09:54:33.907 回答
0

你需要注意的是你第一次插入的结构。例如,您有一些用户有一些列表,您想让他拥有最多 5 个列表。这是您可以使用 PHP 执行此操作的方法:

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

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

完成所有这些之后,您可以像这样轻松地做到这一点:

$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 => 18 告诉他要更新哪个对象以及如何更新。我对此进行测试,如果该列表不存在,它将添加新列表。如果存在,它将跳过它。

希望这可以帮助!

于 2014-04-24T13:47:21.187 回答