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

时间:2018-09-03 11:18:04

标签: node.js mongoose azure-cosmosdb

我正在尝试从我在Azure上拥有的Cosmos数据库中的集合中获取所有文档。该馆藏约有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 Portal /控制台中),该方法也可以使用,但这似乎是一个昂贵的解决方案……不是吗?

我还测试了在递归循环中使用find()批量提取此内容,直到没有更多的文档为止,每次迭代之间都处于睡眠状态(否则,Cosmos DB给我“ 429:请求过多”一会儿。

有没有一种方法可以使用Node.js和Mongoose获得所有50.000个文档,而无需更改RU / s或执行递归循环?

谢谢!

/丹尼尔

1 个答案:

答案 0 :(得分:0)

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

对于MongoDB,查询限制为16Mb(如果您要返回5万个文档,则可能会超过此限制)。看到这里: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?

希望这会有所帮助:)