PHP Mongodb内部文档更新


PHP Mongodb inner document updation

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

您基本上需要.update()方法,其中 $set 是在该方法中使用的操作符,因为它本身不做任何事情。另一件事是你需要知道要更新的"数组位置"。最好的方法是在更新的"查询"部分,并使用位置$操作符来报告位置。

例如,要更新"sushi",这样做:

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

因此.update()的"query"部分是选择文档的第一个参数,并且还具有识别"dishes"中的数组元素的附加信息。"update"部分使用$set操作符只更改指定的字段。符号中间的$告诉语句在与前面的"query"部分匹配的"index"处进行更新。

一般情况下,您还需要使用"点符号"形式来标识数组中的子文档字段。

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