Апсертинг с MongoDB - PullRequest
       17

Апсертинг с MongoDB

1 голос
/ 15 марта 2019

Я ищу способ сделать мой код более элегантным.Я хочу создать запись или обновить существующую в зависимости от того, пустая переменная id или нет.В настоящее время мой код выглядит следующим образом:

    if(data.id == '')
        dbo.collection('parkings').insert(entry, refresh_parkings);     
    else
        dbo.collection('parkings').update({ '_id' : data.id }, entry, refresh_parkings);

Я пытаюсь объединить это в одну строку, используя параметр upsert .Я пробовал довольно много вещей, но это не работает, и запись всегда обновляется, новая запись не создается.

// First attempt
dbo.collection('parkings').update({ '_id' : data.id }, entry, {upsert: true}, refresh_parkings);

// Second attempt
 if(data.id != '')
   var id = {'_id': data.id};
 else
   var id = {};

dbo.collection('parkings').update(id, entry, {upsert: true}, refresh_parkings);

Что мне не хватает?

1 Ответ

1 голос
/ 15 марта 2019

Из документации mongodb, upsert работает следующим образом:

upsert: true создает новый документ, когда ни один документ не соответствует критериям запроса.

Здесь, еслизапрос пуст {}, тогда он будет соответствовать всем документам.Затем он обновляет первый соответствующий документ.

ТАК, что вы должны использовать запрос, который не будет соответствовать ни одному документу, вы должны быть уверены, что он вставит новый.Будьте осторожны, если вы используете {_id: ''} или {_id: 'undefined'}, поскольку ни у одного документа не должно быть такого идентификатора, он не будет работать должным образом: он вставит новый документ с указанным в качестве значения _id.Обязательно используйте другой атрибут для создания запроса.

Попробуйте это тогда:

if(data.id != '')
   var id = {'_id': data.id};
else
  var id = {'unexistingAttribute': 'anyValue'};

dbo.collection('parkings').update(id, entry, {upsert: true}, refresh_parkings);

Затем следует создать новый документ И сгенерировать правильный новый _id, так как ни один документ не должен соответствоватьзапрос предоставлен.

...