MongoDB Realm Webhook删除集合与插入文档数组问题咨询
MongoDB Realm Webhook 实现CSV同步MongoDB问题解决方案
问题1:清空集合报错FunctionError: mongodb delete: no arguments were passed
- 匹配所有文档的通用查询条件可使用
{ _id: { $exists: true } },该条件会匹配集合内全部文档,不会被Realm运行时识别为空参数 - 万条以上数据场景更推荐直接调用
coll.drop()方法删除整个集合,性能比deleteMany遍历删除高3~10倍,集合会在后续插入文档时自动重建,可在catch逻辑中忽略集合不存在的异常
注意:原有代码未处理异步依赖,删除和插入操作会并发执行,大概率出现插入完成后才执行删除的异常,需要改成链式调用或者async/await语法保证执行顺序
问题2:请求体二进制解析失败
Realm Webhook 收到的payload.body默认是Binary类型对象,需要主动转换为字符串再做格式解析:
- 解析JSON格式请求体的代码如下:
// 替换原有body赋值逻辑 const rawBody = payload.body.text(); // 把二进制转为utf-8字符串 const body = JSON.parse(rawBody); // 解析为JS数组/对象
- 如果后续直接传CSV格式的请求体,只需把
Content-Type改为text/csv,拿到rawBody后再通过CSV解析逻辑转换为对象数组即可插入MongoDB
修复后的完整示例代码
exports = async function(payload, response) { const {database, coll_to_update} = payload.query; const contentTypes = payload.headers["Content-Type"]; // 解析请求体 const rawBody = payload.body.text(); const body = JSON.parse(rawBody); console.log("database, coll_to_update:", database, coll_to_update); console.log("Content-Type:", JSON.stringify(contentTypes)); const coll = context.services.get("mongodb-atlas").db(database).collection(coll_to_update); try { // 先清空集合 await coll.drop(); console.log("集合删除成功"); } catch (err) { // 集合不存在时的报错可以忽略 console.log("集合删除跳过,原因:", err.message); } try { // 再批量插入 const insertResult = await coll.insertMany(body); console.log(`成功插入 ${insertResult.insertedIds.length} 条文档`); response.setStatusCode(200); response.setBody(JSON.stringify({code: 0, msg: "同步成功", insertCount: insertResult.insertedIds.length})); } catch (err) { console.error("插入失败:", err); response.setStatusCode(500); response.setBody(JSON.stringify({code: 1, msg: "同步失败", error: err.message})); } return; };
内容的提问来源于stack exchange,提问作者msm1089
相关产品推荐
相关产品推荐

