MongoDB добавляет поля из одной коллекции в другую на основе нескольких условий для большого количества документов

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

У меня есть коллекции, как показано ниже

coll1
{
  "identification_id" : String,
  "name" : String,
  "mobile_number" : Number,
  "location" : String,
  "user_properties" : [Mixed types],
  "profile_url" : String
}

coll2
{
  "identification_id": String,
  "user_id" : String,
  "name" : String,
  "mobile_number" : Number,
  "location" : String,
  "user_properties" : String,
  "profile_url": String,
  "qualified_user" : String,
  "user_interest_stage" :Number,
  "source" : String,
  "fb_id" : String,
  "comments":String
}

updated coll1
{
  "identification_id": String,
  "name" : String,
  "mobile_number" : Number,
  "location" : String,
  "user_properties" : String,
  "profile_url": String,
  "qualified_user" : String,
  "user_interest_stage" :Number,
  "source" : String,
  "fb_id" : String,
  "comments":String
}

Как вы видели coll1 и coll2, ниже будут вставлены сценарии документов

  1. Если пользователь из coll1 квалифицирован на основе некоторых сценариев, где он может проявлять интерес к продуктам, я создам запись в coll2.
  2. Вручную я могу создать новую запись из информации API в coll2
  3. Идентификацией для coll1 в coll2 является user_id
  4. Возможно, что для записи в coll1 может быть несколько записей в coll2.

Теперь по некоторым причинам мы объединяем эти коллекции в одну коллекцию, которая называется coll1. Мы решили обновить квалифицированного посетителя на основе ключа qualified_user и обновить соответствующие поля пользователя в coll1.

Я написал скрипт, используя Node JS и mongoose, который будет извлекать документы из coll1 и проверять квалифицированный_пользователь в coll2 и обновлять на основе следующих сценариев.

  1. Если нет квалифицированного пользователя, обновите документ со значениями по умолчанию для неквалифицированного пользователя.
  2. Если есть один квалифицированный пользователь, скопируйте квалификационные документы из coll2 и обновите в coll1.
  3. Если имеется несколько квалифицированных пользователей, скопируйте первый документ и обновите его в файле coll1. для остальных документов в coll2 создайте новый документ в coll1
  4. После обработки всех документов из coll1 обработайте документы coll2, которые квалифицированы из API, и создайте новый документ в coll1.

Когда я запускаю этот скрипт, я получаю ошибку ниже.

<--- JS stacktrace --->

==== JS stack trace =========================================

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

Есть ли лучший способ справиться с обновлениями БД такого типа для большого количества коллекций?


person Polaiah Bodeddula    schedule 29.02.2020    source источник


Ответы (1)


Вы пытаетесь хранить слишком много документов одновременно, и это приводит к нехватке памяти.

У вас есть два простых варианта:

  1. Используйте cursor Mongo для перебора результатов вместо получения их всех. сразу.
  2. Используйте флаг --max-old-space-size при запуске вашего скрипта, при этом вы можете вручную установить объем памяти, к которому скрипт имеет доступ, например так: node --max-old-space-size=4096 script.js

С учетом сказанного оба они не оптимальны, и если предположить, что ваш масштаб будет продолжать увеличиваться, оба в конечном итоге не сработают. Лично я рекомендую переосмыслить структуру данных. Mongo, будучи неструктурированным языком, плохо справляется с дублированием данных. Это означает, что вы «хотите» хранить все данные в одной коллекции, а затем просто обновлять определенные поля при определенных условиях.

person Tom Slabbaert    schedule 29.02.2020