2016-03-16 2 views
3

У меня есть следующий код. если запись уже существует, она переопределяет существующие поля с новым в $ updated_fields_array. Но если запись не существует, я не знаю, как добавить новую запись с новыми полями ($ new_fields_array). какой оператор я должен использовать? Кто-нибудь может мне помочь?Upsert - php mongodb- Невозможно вставить новую запись

$current_time = time(); 
    $current_mongo_date = new MongoDate($current_time); 

    $collection = $this->mongo->selectCollection(MONGO_NOTIFY_DB, 'AccountSettings'); 

    $criteria_array=array("email" => $email, "name" => $name); 

    $updated_fields_array = array (
     'last_sent' => $current_time, 
     'updated' => $current_mongo_date 
    ); 

    $new_fields_array = array (
     'created' => $current_mongo_date, 
     'updated' => $current_mongo_date, 
     'email' => $email, 
     'name' => $name, 
     'last_sent' => $current_time, 
     'deleted' => FALSE 
    ); 

    try { 

     $collection->update(
      $criteria_array, 
      array('$set' => $updated_fields_array), 
      array("upsert" => true) 
     ); 

    } catch (MongoCursorException $mce) { 
     log_message('error', 'QUERY UPDATE FAILED :: AccountSettings :: ' . print_r($updated_fields_array, true) . ' :: ' . $mce->getMessage()); 
    } 
    return; 

ответ

1

Ответ Евгения хорошо, но вам не хватает одна проблема

У вас есть дубликаты ключей в updated_fields_array и new_fields_array, который выдает MongoDB WriteException, потому что Mongo сначала создаст новый объект и только затем обновит его.

так изменить

$updated_fields_array = array (
    'last_sent' => $current_time, 
    'updated' => $current_mongo_date 
); 

$new_fields_array = array (
    'created' => $current_mongo_date, 
    'updated' => $current_mongo_date, 
    'email' => $email, 
    'name' => $name, 
    'last_sent' => $current_time, 
    'deleted' => FALSE 
); 

в

$updated_fields_array = array (
    'last_sent' => $current_time, 
    'updated' => $current_mongo_date 
); 

$new_fields_array = array (
    'created' => $current_mongo_date, 
    'email' => $email, 
    'name' => $name, 
    'deleted' => FALSE 
); 

и изменить запрос (как писал Евгений или Documentation)

$collection->update(
     $criteria_array, 
     array('$set' => $updated_fields_array, '$setOnInsert'=> $new_fields_array), 
     array("upsert" => true) 
); 
2

Вы можете использовать команду UPDATE с опцией upsert и $ набор/$ операторов setOnInsert (см https://docs.mongodb.org/manual/reference/operator/update/setOnInsert/). Смотрите пример ниже (примечание, что вы должны иметь уникальный индекс на {адрес электронной почты: 1, имя: 1})

$current_time = time(); 
$current_mongo_date = new MongoDate($current_time); 

$collection = $this->mongo->selectCollection(MONGO_NOTIFY_DB, 'AccountSettings'); 

$criteria_array=array("email" => $email, "name" => $name); 

$updated_fields_array = array (
    'last_sent' => $current_time, 
    'updated' => $current_mongo_date 
); 

$new_fields_array = array (
    'created' => $current_mongo_date, 
    'deleted' => FALSE 
); 

try { 

    $collection->update(
     $criteria_array, 
     array('$set' => $updated_fields_array, '$setOnInsert'=> $new_fields_array), 
     array("upsert" => true) 
    ); 

} catch (MongoCursorException $mce) { 
    log_message('error', 'QUERY UPDATE FAILED :: AccountSettings :: ' . print_r($updated_fields_array, true) . ' :: ' . $mce->getMessage()); 
} 
return; 
+0

Я пробовал. Это не работает. –

+0

@YannaGenkin Как точно это не работает - не вставлен ли документ os некоторые поля отсутствуют или не так? –

+0

К сожалению, документ не вставлен. –

0

Я должен был использовать updateOne

$result = $collection->updateOne(
     array('first_id' => 123456,'some_number' => 333333), 
     array('$set' => array('some_status' => 'Delayed')), 
     array('upsert' => true) 
); 

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

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