【问题标题】:Suppress value types in MongoDB Stitch function抑制 MongoDB Stitch 函数中的值类型
【发布时间】:2019-03-27 00:47:57
【问题描述】:

Stitch function 返回每​​个非字符串字段的值类型。我相信这是因为函数在MongoDB Extended JSON 中返回数据。

另一方面,Mongo Shell 返回标准 JSON,并且没有值类型。

如何抑制 MongoDB 函数返回的值类型?是否可以将 EJSON 转换回 JSON?

对于日期字段,例如,Mongo Shell 返回:

"dob" : ISODate("1995-01-11T00:00:00.000-07:00")

Stitch 函数中的相同查询返回:

"dob": {
  "$date": {
    "$numberLong": "232182000000"
  }

我的 Stitch 函数如下所示:

exports = function(){
    const collection = context.services.get("mongodb-atlas").db("mydb").collection("mycollection");
    const doc = collection.find().toArray();
  return doc;
};

是否有一个辅助函数可以去除值类型?比如……

exports = function(){
    const collection = context.services.get("mongodb-atlas").db("mydb").collection("mycollection");
    const doc = collection.find().toArray();
    const noValueTypes = doc.stripValueTypes()
  return noValueTypes;
};

【问题讨论】:

  • 嗨,我想帮忙,但如果可以的话,我需要澄清一些事情。当您说“Stitch 函数中的相同查询返回...”时,您是指来自 Stitch 函数编辑器 UI 吗?您是从客户端 SDK 或其他函数调用函数,还是仅使用函数编辑器上的“运行”按钮?
  • 好问题。是的,我在 1) Mongo Shell 和 2) Stitch 中的函数编辑器中运行查询。函数是等价的,但语法因上下文而异。上面的函数与函数编辑器中显示的完全相同。等效的 Shell 查询如下。它不返回值类型。 db.mycollection.find()
  • 我认为您只是看到 Stitch Function 控制台显示输出的方式。 Stitch 函数本身实际上并不返回 EJSON——它返回一个常规的 JS 对象。我不相信有办法改变函数控制台打印返回值的方式。您可以在函数中使用 console.log() 来打印内容。
  • 另一个观察结果是你没有在等待 collection.find() 调用,所以 doc 实际上是一个 Promise。不确定这对您是否有影响,但我觉得值得指出。
  • Stitch 函数在 webhook 中用于获取 React 应用程序的数据。 API 调用返回键入的数据。我可以使用虚线表示法访问数据(例如absenceDate.$date.$numberLong)。结果,当需要格式化时,前端代码会变得很糟糕(例如{moment(parseInt(ex.absenceDate.$date.$numberLong)).format("MM/DD/YYYY")}。它可以工作,但并不理想。感谢您对此给予关注。

标签: mongodb mongodb-stitch


【解决方案1】:

当一个 Function 结果传递给客户端时,它确实被序列化为 EJSON。

理想情况下,您的客户端可以将 EJSON 解析回常规 JS 对象,例如使用EJSON 库,该库也内置在Stitch SDK 中。

当然,如果您使用的是 Stitch SDK,calling the function directly 会更好。

另一种选择是使用response object 传递 JSON,如下所示:

exports = function(request, response) {
  // ... get data ...
  response.addHeader(
    "Content-Type",
    "application/json"
  );
  response.setBody(JSON.stringify(myData));
};

请注意,JSON 不能表示某些特殊的 BSON 类型,例如对象 id,因此在决定要返回哪些数据时要牢记这一点。

【讨论】:

  • 我没有看到EJSON library。感谢那。与其依赖另一个包,我认为以输入格式(例如absenceDate.$date.$numberLong)访问数据是最好的。正如你所说,直接调用函数是首选,Service Webhooks 允许这样做。
  • "直接调用函数就更好了。"调用函数比使用 webhook 简单得多,而且结果不会序列化为 EJSON。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 2020-11-06
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-29
相关资源
最近更新 更多