【问题标题】:PHP Mongodb inner document updationPHP Mongodb 内文档更新
【发布时间】:2023-03-18 00:59:01
【问题描述】:

我已经解决了很多关于 SO 的问题,但没有运气。

我正在尝试update 数据库的一个字段。

我的一条记录是这样的:

{
        "_id" : ObjectId("53e82f244019968f9eb32f8e"),
        "date" : "12/12/14",
        "dishes" : [
                {
                        "dishname" : "sushi",
                        "quantity" : "4",
                        "price" : "10",
                        "total" : 30,
                        "rating" : "3"
                },
                {
                        "dishname" : "pad thai",
                        "quantity" : "2",
                        "price" : "10",
                        "total" : 20,
                        "rating" : "0"
                }
        ],
        "orderid" : "1234",
        "rating" : "4",
        "sum" : "50"
}

我想更新菜品的'rating' 字段。

到目前为止我已经试过了:

$m = new MongoClient();
$orders = $m->ordertable->ordertable;
$order = $orders->findOne(array('orderid' => '1234'));
$newdata = array('$set' => array("dishes"=> array("rating" => "11")));

它给了我这样的错误:

Notice: Trying to get property of non-object in C:\WWW\bootstrap-3.2.0\docs\examples\carousel\ajax\rating.php on line 36

Fatal error: Call to a member function update() on a non-object in C:\WWW\bootstrap-3.2.0\docs\examples\carousel\ajax\rating.php on line 36

如果我错了,请原谅我,但我被困在这里。它适用于简单的文档,但我无法 更新内部文档中的字段。

请帮忙。

编辑:

架构:

> show dbs;
local   0.078125GB
menu    0.203125GB
ordertable      0.203125GB
project 0.203125GB                   //The DB I am using
test    0.203125GB


> db.orders.find().pretty();
{
        "_id" : ObjectId("53e88de4ab129b4b8094eeba"),
        "orderid" : "1234",
        "dishes" : [
                {
                        "dishname" : "sushi",
                        "quantity" : "4",
                        "price" : "10",
                        "total" : 30,
                        "rating" : "3"
                },
                {
                        "dishname" : "pad thai",
                        "quantity" : "2",
                        "price" : "10",
                        "total" : 20,
                        "rating" : "0"
                }
        ],
        "sum" : "50",
        "date" : "12/12/14"
}
>

我的最终代码:

$m = new MongoClient();

$orders = $m->project->orders;

$orders->update(
        array(
           array('orderid' => '1234'),
           array('dishes.dishname' => 'sushi') 
            ),
            array(
           '$set' => array( 'dishes.$.rating' => '5')
            )
    );

【问题讨论】:

  • 菜肴的哪个元素? $set 是这样做的方式,但不是你使用它的方式。文档中有示例。
  • 你能根据我的演示记录发一个吗?我想更改每个 dish 字段的 rating 字段。我很抱歉问,但请您提供我的前代码。我已经浏览了文档:/

标签: php mongodb sql-update mongodb-php


【解决方案1】:

您基本上想要.update() 方法,其中$set 是该方法中使用的运算符,因为它本身什么都不做。另一件事是您需要知道要更新的“数组位置”。执行此操作的最佳方法是在更新的“查询”部分中,并使用 positional $ 运算符报告位置。

例如,要更新“sushi”,请执行以下操作:

$orders->update(
   array( 'orderid' => '1234', 'dishes.dishname' => 'sushi' ),
   array(
       '$set' => array( 'dishes.$.rating' => 11 )
   )
);

所以.update() 的“查询”部分是选择文档的第一个参数,并且还有额外的信息来识别“菜”中的数组元素。 “更新”部分使用$set 运算符仅更改指定字段。符号中间的$ 告诉语句在与之前的“查询”部分匹配的“索引”处更新。

通常您还希望使用如图所示的"dot notation" 表单来标识数组中的子文档字段。

MongoDB 官方文档以及 PHP 文档可以提供帮助。

【讨论】:

  • 感谢您的回复,但未更新。我什至尝试从orders 获取单个order 并更新它(我知道这不是办法)但它说无法更新order。当我运行你的代码时,我没有收到错误或警告,所以我无法告诉你哪里出了问题。编辑:我什至试过$push
  • 我什至单独尝试了 array( 'orderid' => '1234' )array('dishes.dishname' => 'sushi') 以了解它是否获得了 orders 并且工作正常。
  • @ADi 工作正常意味着什么?您需要匹配数组位置,因此只有第二种形式可以作为唯一的查询参数。如果它不像所示那样工作,那么您的文档实际上与所示的相同规格不匹配。因此,“orderid”和“dishes.dishname”与您发布的相同数据规范不匹配。即“为我工作”您发布的方式和答案。
猜你喜欢
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 2016-08-04
  • 2014-02-05
相关资源
最近更新 更多