Upsert — php mongodb — не могу вставить новую запись

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

    $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;

3

Решение

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

У вас есть дубликаты ключей в 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
);

и измените запрос (как писал Евгений или Документация)

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

Другие решения

Вы можете использовать команду UPDATE с опцией upsert и операторами $ set / $ setOnInsert (см. https://docs.mongodb.org/manual/reference/operator/update/setOnInsert/). См. Пример ниже (обратите внимание, что у вас должен быть уникальный индекс {email: 1, name: 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;
2

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

$result = $collection->updateOne(
array('first_id' => 123456,'some_number' => 333333),
array('$set' => array('some_status' => 'Delayed')),
array('upsert' => true)
);
0
По вопросам рекламы [email protected]