PHP Mongodb内部文档更新

时间:2014-08-11 08:22:39

标签: php mongodb sql-update mongodb-php

我经历过很多关于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')
            )
    );

1 个答案:

答案 0 :(得分:0)

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

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

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

因此.update()的“查询”部分是第一个选择文档的参数,还有其他信息来识别“菜肴”中的数组元素。 “更新”部分使用$set运算符仅更改指定的字段。符号中间的$告诉语句在“index”之前的“index”匹配时更新。

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

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