Запрос MongoDB возвращает ноль, даже если он доступен в коллекции после миграции из mlab в атлас mongoDB - PullRequest
3 голосов
/ 09 апреля 2020

Я перемещаю базу данных из Mlab в MongoDB Atlas. Нам пришлось обновить npm версию mongodb до 3.4.1, так как версия базы данных MongoDB atlas 4.2.5.

Функция соединения была обновлена, как сказано в этом ответе . Но после обновления версии npm до 3.4.1 запрос findOne возвращает нулевое значение, даже если документ доступен в коллекции. Вот фрагмент кода, относящийся к запросу findOne,

  db.collection('organisations').findOne({ _id: database.ObjectID(orgState) })
    .then((activeOrganisation) => {
      console.log(activeOrganisation);
      data.activeOrganisation = activeOrganisation;
      callback(null, activeOrganisation);
    }, (error) => {
      callback(error, null);
    });

. Из-за этого мне было интересно, есть ли проблема с подключением к базе данных, поэтому я протестировал его с помощью db.serverConfig.isConnected(), db.databaseName и db.listCollections().toArray(). isconnected вернул true, и возвращенное имя базы данных также является правильным. Но db.listCollections().toArray() вернул пустой массив, что означает, что в моей базе данных нет коллекций, которых не может быть.

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

db.collection('users').findOneAndUpdate(
        { emails: { $elemMatch: { email: "rajitha1591@outlook.com" } } },
        { $addToSet: { unsubscribedEmails: "models" } })
        .then((result) => {
          console.log(result);

            if (!result) {
                console.error('Error: ', 'User not found')
            }
            console.log('Output: ', 'Sucessfully unsubscribed');
            callback(null,'Successful')
        }, (error) => {
            callback(error, null);
        });

Результат содержит

{
  lastErrorObject: { n: 0, updatedExisting: false },
  value: null,
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1586436331 },
    signature: { hash: [Binary], keyId: [Long] }
  },
  operationTime: Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1586436331 }
}

Это ясно говорит о том, что документ не обновлялся (updatedExisting: false). Я проверил соответствующий документ в MongoDB Atlas с помощью веб-браузера, и документ не был обновлен путем добавления значения "models" в массив unsubscribedEmails.

В дополнение к этому я попытался установить fre sh node_modules, удалив также package-lock.json.

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

Было бы неплохо услышать предложения по этой проблеме

1 Ответ

0 голосов
/ 10 апреля 2020

Структура баз данных различается в mlab и mongoDB Atlas. Общий кластер mlab представляет собой одну базу данных, а общий кластер mongoDB atlas может содержать несколько баз данных.

На следующем рисунке показаны базы данных mlab.

Databases in mlab

Это изображение, когда вы go внутри базы данных

database

После процесса миграции (перенос с использованием инструмента, предоставленного mlab и Atlas). Он создал общий кластер с именем maturify-demo и базу данных с именем maturify_demo. Посмотрите на изображения ниже.

Кластер атласа atlas cluster

База данных внутри кластера atlas database

Во время В процессе миграции было изменено имя кластера, которое использовалось в Mlab (maturify_demo на maturify-demo)

При подключении к базе данных с помощью клиента я использовал maturify-demo в качестве имени базы данных, думая, что кластер представляет собой база данных как Mlab (cachedDb = client.db('maturify-demo');). Что на самом деле должно быть maturify_demo. Но когда я тестирую соединение с базой данных, используя db.serverConfig.isConnected() и db.databaseName. Он возвратил true и maturify-demo, что немного сбивало с толку, когда он показывает базу данных, которая недоступна в MongoDB Atlas. Как упоминалось в комментарии ниже, @Joe позволяет добавлять документы в качестве новой базы данных, даже если база данных в настоящее время не существует.

...