【问题标题】:PHP/MongoDB $set use for update an array in a collectionPHP/MongoDB $set 用于更新集合中的数组
【发布时间】:2014-11-01 02:49:33
【问题描述】:

我正在尝试 update() 集合中的特定单个数组,但是虽然它可以在单个特定数组上与 $push 参数一起正常工作,但它不适用于 $set 参数。

我不太明白这背后的逻辑,因为当我使用这样一个 $push 元素的例子时:

 $post_comment = array('$push' => 
    array("comments" => array(
    "_id" => new MongoId(),
    "comment" => htmlspecialchars($_POST['comment']),
    "author" => $user->username,
    "date" => new MongoDate()
      )
    )
  );
  $entries->update(array( 
    "_id" => $_GET["id"]), $post_comment);

它给了我一个 MongoDB 数据库中的数组,看起来或多或少像这样(分别推入四个项目):

{
    "_id" : "css-clearfix-explained",
    "comments" : [ 
        {
            "_id" : ObjectId("540cc940af105b19133c9869"),
            "comment" : "aaa",
            "author" : "maciejsitko",
            "date" : ISODate("2014-09-07T21:08:16.215Z")
        }, 
        {
            "_id" : ObjectId("540cc943af105b19133c986a"),
            "comment" : "bbb",
            "author" : "maciejsitko",
            "date" : ISODate("2014-09-07T21:08:19.542Z")
        }, 
        {
            "_id" : ObjectId("540cc946af105b19133c986b"),
            "comment" : "ccc",
            "author" : "maciejsitko",
            "date" : ISODate("2014-09-07T21:08:22.968Z")
        }
    ]
}

这基本上是我想要的,并且根据文档在逻辑上可以正常工作。但是当我尝试使用 $set 来编辑单个评论时,以类似的方式显示:

$edit_comment = array('$set' => 
    array("comments" => array(
    "_id" => new MongoId($_POST['cmt-id']),
    "comment" => htmlspecialchars($_POST['edit-comment']),
    "author" => $user->username,
    "date" => new MongoDate()
      )
    )
  );
  $entries->update(array( 
    "_id" => $_GET["id"]), $edit_comment);

它输出四个不同的数组来代替前面的数组,为了说明这一点,我将展示当我将第一条评论“aaa”更新为“ddd”时发生的情况:

{
    "_id" : "css-clearfix-explained",
    "comments" : {
        "_id" : ObjectId("540cc940af105b19133c9869"),
        "comment" : "ddd\r\n                          ",
        "author" : "maciejsitko",
        "date" : ISODate("2014-09-07T21:12:10.833Z")
    }
}

所有四个数组元素几乎都被删除了,取而代之的是四个字段作为四个独立的数组元素。

怎么会?它不应该像上面的 $push 示例一样正常工作吗?

【问题讨论】:

    标签: php arrays mongodb


    【解决方案1】:

    您没有在comments 中指定索引。因此,$set 用提供的关联数组替换了数组comments。 如果要更新评论,请更改第一个参数中的查询以通过唯一字段匹配评论。例如,日期。在第二个参数中使用位置 $ 运算符。

    例子:

    $edit_comment = array('$set' => 
      array("comments.$" => array(
      "_id" => new MongoId($_POST['cmt-id']),
      "comment" => htmlspecialchars($_POST['edit-comment']),
      "author" => $user->username,
      "date" => new MongoDate()
        )
      )
    );
    // this assumes the post date is unique. On second though use something else.
    $query = array( "_id" => $_GET["id"], "comments.date" => $_POST['post-date'])
    $entries->update( $query, $edit_comment);
    

    查看此内容以获取更多信息和更好的解释: MongoDB - $set to update or push Array element

    【讨论】:

    • 好吧,我使用唯一日期应用了这个解决方案,只是为了测试它,当我点击更新时没有任何反应,数组也是如此,它没有改变。甚至没有错误,但它并不完全有效。
    • 好的,现在可以了,我只是使用了不同于 MongoDate 项目的东西,使用了会话登录对象中的 $user->username,效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2017-03-19
    • 2019-08-10
    • 2018-06-14
    • 1970-01-01
    相关资源
    最近更新 更多