【问题标题】:Can't fetching all documents from my mongodb on Azure Cosmos DB无法从 Azure Cosmos DB 上的 mongodb 获取所有文档
【发布时间】:2019-02-08 10:46:28
【问题描述】:

我正在尝试从我在 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】:

    为避免混淆,我假设您使用 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?

    希望这会有所帮助:)

    【讨论】:

    • 感谢您的帮助!我最终解决了如何使用游标,并用流对其进行了迭代。但即使我这样做了,我有时也会从 mongodb 得到错误。有时这有效,有时则无效。幸运的是,这只是为了在本地运行一次或两次维护作业,但仍然...... :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 2018-04-13
    相关资源
    最近更新 更多