无法从 Azure Cosmos DB 上的 mongodb 获取所有文档



我正在尝试从我在Azure上的Cosmos DB中的集合中获取所有文档。该馆藏包含大约 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);
});

当我在find()上设置 1000 或 1500 的限制时,它可以工作。

我还测试了将集合上的 RU/s 从 400 更改为 10.000(在 Azure 门户/控制台中(,这也可以工作,但这似乎是一个昂贵的解决方案......不是吗?

我还测试了在递归循环中批量使用find()获取此内容,直到没有更多文档,每次迭代之间都有睡眠状态(否则 Cosmos DB 会在一段时间后给我"429:请求太多"。

有没有办法让我使用 Node.js 和 Mongoose 获取所有 50.000 个文档,而无需更改 RU/s 或执行递归循环?

提前感谢!

/丹尼尔

为了避免混淆,我假设你正在使用MongoDB驱动程序来访问Azure中的Cosmos?

对于MongoDB,查询限制为16Mb(如果您返回50k文档,则很可能会超过此限制(。看这里: https://docs.mongodb.com/manual/reference/limits/

节点驱动程序中可能未强制实施限制(我尚未检查其源代码(,在这种情况下,值得查阅 Azure 文档:https://learn.microsoft.com/en-us/azure/cosmos-db/faq

结果是,当您处理大量此类文档时,您确实应该使用光标在集合中遍历。请参阅此处:如何使用 Node.js 在 MongoDB 中使用 cursor.forEach((?

希望这对:)有所帮助

最新更新