Не удается получить все документы из моего mongodb в Azure Cosmos DB - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь получить ВСЕ документы из коллекции в моей базе данных Cosmos, которую я имею в Azure. Коллекция содержит около 50 000 документов.

Я получаю эту ошибку: MongoError: cursor does not exist, was killed or timed out, когда я делаю это:

const mongoose = require('mongoose');
const mongooseOptions = { useNewUrlParser: true };
mongoose.connect(connectionString, mongooseOptions);
mongoose.set('useCreateIndex', true);
mongoose.Promise = global.Promise;
const mongoDB = mongoose.connection;
mongoDB.on('error', console.error.bind(console, 'MongoDB connection error:'));

const Schema = mongoose.Schema;
const MongoEidModelSchema = new Schema({
    uid: { type: String, unique: true },
    eid: { type: String, unique: true }
});

const MongoEidModel = mongoose.model('eids', MongoEidModelSchema);
MongoEidModel.find({}, {timeout: false}).then(data => {
    console.log(data);
    console.log(Object.keys(data).length);
});

Когда я устанавливаю предел 1000 или 1500 на find(), он работает.

Я также протестировал изменение RU / s для коллекции с 400 на 10.000 (на портале / консоли Azure), что также работает, но это кажется дорогостоящим решением ... не так ли?

Я также проверил, чтобы получить это с find() в пакетах в рекурсивном цикле, пока не останется больше документов, с перерывом между каждой итерацией (в противном случае Cosmos DB выдает мне «429: слишком много запросов» через некоторое время .

Есть ли способ, которым я могу получить ВСЕ 50 000 документов, используя Node.js и Mongoose, не меняя RU / s или не делая рекурсивные циклы?

Заранее спасибо!

/ Daniel

1 Ответ

0 голосов
/ 03 сентября 2018

Чтобы избежать путаницы, я предполагаю, что вы используете драйвер MongoDB для доступа к Cosmos в Azure?

Для MongoDB существует ограничение запроса в 16 Мб (которое вы вполне можете отстреливать, если возвращаете 50 тыс. Документов). Смотрите здесь: https://docs.mongodb.com/manual/reference/limits/

Возможно, что ограничение не применяется в драйвере узла (я не проверял его источник), и в этом случае стоит обратиться к документации Azure: https://docs.microsoft.com/en-us/azure/cosmos-db/faq

В результате вы должны использовать курсор для перемещения по коллекции, когда имеете дело с большим количеством документов, подобных этому. Смотрите здесь: Как я могу использовать cursor.forEach () в MongoDB, используя Node.js?

Надеюсь, это поможет:)

...