【发布时间】:2021-09-15 21:02:32
【问题描述】:
我有一个用例,我想在文件被修改时将 csv 文件的内容发送到 mongoDB 集合。我发现可以在 mongoDB Realm 中创建一个 webhook。下面代码的目的是做两件事。首先,在指定的数据库中删除指定的集合。其次,将许多(~10k+)个文档插入到指定的集合中。
exports = function(payload, response) {
const {database, coll_to_update} = payload.query;
const contentTypes = payload.headers["Content-Type"];
const body = payload.body;
console.log("database, coll_to_update:", database, coll_to_update);
console.log("Content-Type:", JSON.stringify(contentTypes));
console.log("Request body:", body);
const coll = context.services.get("mongodb-atlas").db(database).collection(coll_to_update);
coll.deleteMany({})
.then(result => console.log(`Deleted ${result.deletedCount} item(s).`))
.catch(err => console.error(`Delete failed with error: ${err}`))
coll.insertMany(body)
.then(result => console.log(`Successfully inserted ${result.insertedIds.length} items!`))
.catch(err => console.error(`Failed to insert documents: ${err}`))
return payload;
};
这是在在线 Realm UI 的函数编辑器中编写的。因为我找不到删除集合的方法,所以我尝试通过传递一个空查询来删除其中的所有文档。但我收到一条错误消息FunctionError: mongodb delete: no arguments were passed。如果我提供查询,我可以删除文档。是否有任何查询可以始终匹配我可以使用的所有文档,或者有更好的方法来删除或删除集合中的所有文档?
第二个问题是我不确定如何解码请求正文中发送的 csv 内容。我正在使用的卷曲如下。只是为了测试,我也将它发送到http://httpbin.org/post 并且json被正确解码为两个对象的数组:
curl -H "Content-Type: application/json" -d [{\"foo\":\"bar\"},{\"baz\":\"zap\"}] \
"https://eu-west-1.aws.webhooks.mongodb-realm.com/api/client/v2.0/app/application-0- \
abcdef/service/mongo_doodah/incoming_webhook/webhook0? \
database=FIC&coll_to_update=FIC_data&secret=not_this_one"
但是,当发送到 Realm 端点时,我收到错误 FunctionError: mongodb insert: argument must be an array。检查我看到的日志:
Logs:
[
"database, coll_to_update: FIC FIC_data",
"Content-Type: [\"application/json\"]",
"Request body: [object Binary]"
]
Body:
{
"$binary": {
"base64": "W3siZm9vIjoiYmFyIn0seyJiYXoiOiJ6YXAifV0=",
"subType": "00"
}
}
因此,Realm 在处理我发送的 json 的方式上与例如 pastebin 的工作方式不同。我无法弄清楚如何在 Realm webhook 编辑器中从这个二进制对象中获取我发送的 json。
【问题讨论】:
标签: javascript mongodb realm