我已经通过了很多关于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文档都可以提供帮助。