我经历过很多关于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')
)
);
答案 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文档可以提供帮助。