2016-06-04 3 views
1

Я пытаюсь получить upsert работать и не получая никаких результатовupsert скрипт не работает

У меня есть три переменные я отправляю до этого сценария. Если я обновляюсь, я получаю результат, но я хочу усовершенствовать и не получаю никаких результатов.

Вот мой код:

if(isset($_POST)){ 
    if($array){ 
     $doc = $collection->update(
      array(
       '$set' => array(
        '_id' => new MongoId(), 
        'organization' => $mysql_org_name, 
        'purch_code' => $mysql_purch_code, 
        'contentname' => $mysql_order_item_name, 
        array('upsert' => true) 
       ) 
      ) 
     ); 
    } 
} 
+0

Только что заметил, что ваш вопрос отмечен как 'mongodb', но все ваши имена переменных содержат' mysql'. Если вы не выполняете миграцию между БД или б) это ссылки на материал, который хранится отдельно в БД MySQL, я бы переименовал их. Кроме того, я предлагаю вам отредактировать заголовок вашего вопроса, чтобы указать, какой тип БД вы фактически используете. – cyfur01

+0

@ cyfur01 Вы правы, vars предопределены вашим MySQL_, так как я беру их из двух MySQL-запросов и пытаюсь активировать их в mongo. Я понимаю путаницу, но они просто имена и используются только для этой цели и только в этом скрипте. Я беру vars из таблиц WP WooCommerce и копирую их приложение, которое я разработал против mongodb. – Dennis

ответ

1

Update expects 3 argument arrays Вы только прошли один

.. Во-первых, вы включили опции как часть массива $set. Они должны быть переданы в качестве отдельного аргумента после предложения обновления.

Кроме того, у вас нет критериев соответствия (т. Е. Инструкции запроса, чтобы выбрать, какие элементы необходимо обновить). При использовании upsert и $set новый элемент будет создан с полями из обоих массивов (see the relevant documentation).

И, наконец, если вы не указали значение для _id, Mongo сгенерирует его для вас.


Если, например, вы хотите, чтобы соответствовать на основе organization поле:

if(isset($_POST)){ 
    if($array){ 
     $doc = $collection->update(
      array('organization' => $mysql_org_name), 
      array(
       '$set' => array(
        'purch_code' => $mysql_purch_code, 
        'contentname' => $mysql_order_item_name, 
       ) 
      ), 
      array('upsert' => true) 
     ); 
    } 
} 

Если это соответствует одному или более записей, только purch_code и contentname поля будут обновлены на первом согласовании object (для обновления нескольких записей вам нужно указать 'multiple'=>true в вашем массиве параметров). Если ничего не соответствует, новая запись будет вставлена:

  1. Сгенерированного _id
  2. Всех значений критериев соответствия (т.е. organization)
  3. Всех значений оператора обновления (т.е. purch_code и contentname)
+0

Отличное объяснение @ cyfur01. Это все еще не работает, но не ваша проблема. У меня проблемы, прежде чем я попаду в эту часть кода. Я по-прежнему отмечаю ваше решение как правильное, потому что вы действительно отлично справились с объяснением процесса upsert. Спасибо чувак! – Dennis

1

У вас есть переменная $ набор на одинарные кавычки '$ набор' => массив (

+0

'$ set' - это оператор MongoDB, а не переменная. Он должен быть в одинарных кавычках, чтобы PHP не выполнял замену подстановки. – cyfur01

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