Как вставить документы, если они еще не существуют из удаленного метода в MongoDb, используя LoopBack - PullRequest
0 голосов
/ 10 июня 2019

Я очень новичок в MongoDB (около 4 дней) и пытаюсь вставить документы в свою коллекцию из удаленного метода с использованием Loopback без добавления дубликатов документов.

Сначала я протестировал добавление документовкак таковой:

Events.create(resultData);

, который работал без проблем.

Затем я перешел к попытке добавить документ без добавления дубликатов несколько других ответов :

Events.update(data,data,{upsert: true});

Однако это ничего не добавило в базу данных.

Я решил пойти дальше и попробовать посмотреть, смогу ли я сначала проверить, можно ли найти документ из коллекции, и поэтомуне добавить документ.Похоже на этот ответ .

if(Events.find({itemOfData: resultData.itemOfData},{limit: 1}).size < 1){
    Events.create(resultData);
}

Однако, как и раньше, он не создает никаких документов.

Я не уверен, что делать дальше, или нетРеализация вышеуказанных решений является ошибочной.

1 Ответ

1 голос
/ 17 июня 2019

Events.update(data,data,{upsert: true});

Модели LoopBack не предоставляют API MongoDB.Такие методы, как create, предоставляют независимый от базы данных API, который сопоставляется соединителями с командами базы данных.

Если вы хотите вставить документ только в том случае, если он не существует, вы можете использовать один из следующих методов (в зависимости отчто вы пытаетесь достичь):

  • replaceOrCreate
  • patchOrCreate (также известный как upsert и updateOrCreate)
  • findOrCreate
  • upsertWithWhere

if(Events.find({itemOfData: resultData.itemOfData},{limit: 1}).size < 1){

Метод find принимает объект Filter (см. Запрос данных ), который содержит не только условие для сопоставления записей, но также такие вещи, как нумерация страниц и какие связанные модели включать.Условие хранится в свойстве where объекта Filter.

Также метод find возвращает Promise, вам нужно дождаться его разрешения, прежде чем подсчитать количество возвращенных записей.

const found = Events.find({
  where: {itemOfData: resultData.itemOfData}
  limit: 1
});
if (found.size < 1){
  // ...
}

Хотя решение, основанное на find, может показаться хорошо работающим в процессе разработки, оно вводит условие гонки, при котором две "одинаковые" записи могут создаваться, когда приложение находится под высокой нагрузкой.По возможности рекомендуется использовать встроенные функции, такие как patchOrCreate, которые используют специфичные для базы данных средства для обеспечения атомарности.

...