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

问题描述 投票:0回答:1

我试图从我在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或执行递归循环?

提前致谢!

/丹尼尔

node.js mongoose azure-cosmosdb
1个回答
0
投票

为避免混淆,我假设您使用MongoDB驱动程序访问Azure中的Cosmos?

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

有可能在节点驱动程序中没有强制执行限制(我没有检查过它的来源),在这种情况下值得咨询Azure文档:https://docs.microsoft.com/en-us/azure/cosmos-db/faq

结果是,当您处理大量这样的文档时,您应该使用光标来遍历集合。见这里:How can I use a cursor.forEach() in MongoDB using Node.js?

希望这可以帮助 :)

© www.soinside.com 2019 - 2024. All rights reserved.