如何将Azure Function获取的API数据写入Mongo DB
Azure Function 拉取API数据写入MongoDB 实现步骤
前置准备
- 给Function项目安装官方MongoDB驱动:通过NuGet安装
MongoDB.Driver,不要使用第三方封装的驱动,避免兼容性问题。如果是隔离工作模型的C# Function、Python/JS/Java栈Function,直接安装对应语言的官方Mongo SDK即可。 - 提前整理好MongoDB连接信息:连接字符串、目标数据库名、目标集合名。如果使用Azure Cosmos DB for MongoDB,直接从门户复制连接字符串即可;如果是自建Mongo或者其他云Mongo,提前把Function的出站IP、本地调试的公网IP加到MongoDB白名单,否则会出现连接超时。
配置项处理
不要把连接字符串、密钥硬编码在代码里:
- 本地调试时,把Mongo连接信息写到
local.settings.json的Values节点下 - 部署到Azure后,把对应配置项加到Function的「应用程序设置」里
- 建议配置键名统一用
MongoDbConnection、MongoDbName、MongoCollectionName,方便后续维护。
代码实现注意点
核心注意:
MongoClient是线程安全的,一定要做静态单例初始化,不要每次函数触发都新建客户端实例,否则会快速耗尽MongoDB连接池,触发连接报错。
以C# 进程内模型Function为例,核心逻辑如下:
- 静态初始化Mongo客户端
// 类级别静态变量,整个Function实例生命周期内复用 private static readonly MongoClient _mongoClient = new MongoClient(Environment.GetEnvironmentVariable("MongoDbConnection")); private readonly ILogger _log; // 构造函数注入日志,和你原有Function的写法保持一致即可 public YourFunction(ILogger<YourFunction> log) { _log = log; }
- 在你原有拉取API数据的逻辑之后,加入Mongo写入逻辑
[FunctionName("YourFunctionName")] public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequest req) { // --- 这里是你原有的拉取API数据的逻辑,拿到处理后的数据apiResult --- var apiResult = await FetchDataFromTargetApi(); // 你自己写的API拉取方法 // 拿到Mongo库、集合的引用 var db = _mongoClient.GetDatabase(Environment.GetEnvironmentVariable("MongoDbName")); // 如果是强类型模型,把BsonDocument替换成你自己的实体类即可 var collection = db.GetCollection<BsonDocument>(Environment.GetEnvironmentVariable("MongoCollectionName")); try { // 单条数据插入用InsertOneAsync await collection.InsertOneAsync(apiResult.ToBsonDocument()); // 批量数据插入用InsertManyAsync,单批建议控制在100-1000条,数据量太大就分批插入 // await collection.InsertManyAsync(apiResultList.Select(x => x.ToBsonDocument())); _log.LogInformation("数据写入MongoDB成功"); } catch (MongoException ex) { _log.LogError($"写入MongoDB失败,错误信息:{ex.Message}"); // 这里可以加重试、失败数据投递死信队列的逻辑,避免数据丢失 return new BadRequestObjectResult($"数据写入失败:{ex.Message}"); } return new OkResult(); }
其他语言栈的逻辑完全一致:初始化单例Mongo客户端 -> 拉取API数据 -> 拿到集合引用 -> 执行插入 -> 捕获异常打日志。
部署后常见问题排查
- 报错连接超时:优先检查MongoDB白名单是否加了Function的出站IP,如果Mongo部署在VNet内部,需要给Function开启VNet集成
- 报错权限拒绝:检查连接字符串里的账号密码是否正确,对应账号是否有目标库、集合的写入权限
- 报错格式校验失败:检查API返回的数据是否存在BSON不支持的格式,比如循环引用、非法字段名、超出BSON大小限制的内容
- 偶发连接池耗尽:检查是不是每次函数触发都新建了MongoClient实例,改成静态单例即可
优化建议
- 如果需要保证数据不重复插入,可以用业务唯一字段给集合建唯一索引,实现幂等写入
- 给每条插入的数据加同步时间戳字段,方便后续排查数据同步进度
- 数据量较大时不要单次全量拉取全量插入,做分页拉取、分批写入,避免单次请求超时
内容的提问来源于stack exchange,提问作者Khushi Sood
相关产品推荐
相关产品推荐

