1. 首页
  2. Web

PHP/MongoDB $set use for update an array in a collectionPHP/MongoDB $set 用于更新集合中的数组

正在尝试 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 示例一样正常工作吗?
解决方案:
没有在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);
[送杯奶茶]
  • 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
  • 文章链接:https://www.imiowo.com/914.html [复制] (转载时请注明本文出处及文章链接)
上一篇:
:下一篇
又是元气MAX的一天(●'◡'●)

作者:秫米

秫米
介绍:来一起坐下喝杯奶茶!

文章:77篇

最后更新:23-11-01

发表评论

gravatar

当前页面评论被关闭,原因如下: