2014-08-11 3 views
0

У меня много вопросов на SO, но вам не повезло.Обновление внутреннего документа PHP Mongodb

Я пытаюсь использовать 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 

Прости меня, если я ошибаюсь, но я застрял здесь. Он работает для простого документа, но я не могу обновить поле внутри внутреннего документа.

Пожалуйста, помогите.

EDIT:

Схема:

> 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

Какой элемент посуды? '$ set' - это способ сделать это, но не так, как вы его используете. В документации есть примеры. –

+0

Можете ли вы отправить сообщение в соответствии с моей демо-записью? Я хочу изменить поле 'рейтинг' каждого поля' dish'. Прошу прощения, но можете ли вы предоставить мне код ex. Я уже прошел через документацию:/ –

ответ

0

Вы в основном хотите .update() метод, для которого $set является оператором используется в данном методе он ничего не делает сам по себе. Другое дело, вам нужно знать «позицию массива», в которой нужно обновить. Наилучший способ сделать это - в разделе «запрос» обновления и с помощью оператора positional $ для отчета о позиции.

Например, чтобы обновить «суши» сделать это:

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

Таким образом, «запрос» часть .update() является первым аргументом, который выбирает документ, а также имеет дополнительную информацию для идентификации элемента массива в "блюда". В разделе «Обновление» используется оператор $set только для изменения указанного поля. $ в середине обозначений сообщает оператору обновлять «сопоставление индекса» из части «запрос» ранее.

Как правило, вы также хотите использовать форму "dot notation", как показано для определения полей поддокумента в массиве.

Официальная документация MongoDB, а также документы PHP, помогут вам.

+0

благодарит за ответ, но не обновляет его. Я даже пытался получить один «заказ» из «заказов» и обновить его (я знаю, что это не так), но он говорит, что не может обновить 'order'. Когда я запускаю свой код, я не получаю никаких ошибок или предупреждений, поэтому я не могу сказать вам, что не так. EDIT: Я даже попробовал '$ push'. –

+0

Я даже попробовал 'array ('orderid' => '1234')' и 'array ('dishes.dishname' => 'sushi')' специально, чтобы узнать, получает ли он 'orders', и он работает нормально. –

+0

@ADi Работает отлично, что? Вам нужно сопоставить позицию массива, так что только вторая форма будет работать как единственный аргумент запроса. Если это не работает, как показано, ваш документ фактически не соответствует тем же спецификациям, что и показано. Поэтому «orderid» и «dish.dishname» не соответствуют той же спецификации данных, которую вы опубликовали. i.e «Работает для меня», как вы опубликовали и с ответом. –

 Смежные вопросы

  • Нет связанных вопросов^_^