【问题标题】:How to get to_json work on BSON::Code object as well in mongo-ruby-driver如何让 to_json 在 BSON::Code 对象以及 mongo-ruby-driver 上工作
【发布时间】:2012-02-13 10:49:59
【问题描述】:

我正在为某个项目尝试“mongo-ruby-driver”。它工作正常,除非我在 mongo 对象上调用 to_json 。它提供了格式良好的 json,但它没有将 BSON::Code 转换为可读值,从而生成 JSON。

它不显示代码文本,而是显示类似

#<BSON::Code:0x00000100af6fa8>

有人试过吗?非常感谢任何帮助 ID。

更新

这里是一些代码sn-p:

@records 是包含 MongoDB 文档数组的变量。

@records.to_json

当我调用 to_json 时,它会按预期提供一切。除了包含 BSON::Code 的键(表示 javascript 代码)。例如考虑以下文档:

{ 
  "_id" : "contains", 
  "value" : function( obj, target ) { return obj.indexOf(target) != -1; }; 
}

从 ruby​​ 查询相同的文档会得到如下输出:

{
  "_id"=>"contains", 
  "value"=><BSON::Code:2160165280 @data="function( obj, target ) { return obj.indexOf(target) != -1; };" @scope="{}">
}

并为此调用 to_json 会得到以下结果:

{"_id":"contains","value":"#<BSON::Code:0x00000100b54658>"}

这就是问题所在。我没有获取“值”键的实际代码,而是将 ruby​​ 对象作为字符串。

在 BSON::Code 上调用 code 方法我们可以将其转换为代码。但为此我需要循环 mongo 文档,检查每个键的值,如果它是 BSON::Code 的对象,则在其上调用代码,然后将其分配回键。最后我们可以调用 to_json 。但我不想要这么多开销。我需要 to_json 自己来处理它。

【问题讨论】:

  • 你能用你的代码更新答案吗?
  • 是的,我用代码更新了问题。

标签: ruby mongodb nosql


【解决方案1】:

迭代数组中对象属性的序列化程序可能正在调用 to_s 方法,这将导致您看到的输出。

您可以修改 BSON::Code 类以包含 to_s 方法,该方法调用检查(产生所需输出的方法)或修改序列化程序以检测它何时遇到 BSON::Code 实例并调用检查在它上面而不是 to_s。

修改 BSON::Code 类的代码如下所示:

module BSON
  class Code
    def to_s
      inspect
    end
  end
end

这将具有与检查相同的行为。如果你只是想要代码,你可以修改它:

module BSON
  class Code
    def to_s
      @code
    end
  end
end

我可能会将此作为驱动程序中 to_s 的默认行为,但现在只需将其包含在您的代码中,它应该像冠军一样工作。

【讨论】:

    【解决方案2】:

    哪个Mongo对象,你的意思是模块?如果可以,请发布代码以及您要执行的操作。

    我在驱动程序中看到的唯一 to_json 是 BSON::ObjectId#to_json,它(来自文档)被描述为执行以下操作的方法:

    转换为 MongoDB 扩展 JSON 格式。由于 JSON 包含类型信息,但缺少 ObjectId 类型,因此这种 JSON 格式使用 $oid 键对类型进行编码。

    我使用它时得到相同的结果:

    1.9.3-p0 :001 > require 'mongo'
     => true 
    1.9.3-p0 :002 > BSON::ObjectId
     => BSON::ObjectId 
    1.9.3-p0 :003 > BSON::ObjectId.new()
     => BSON::ObjectId('4f17350eadd361e91d000001') 
    1.9.3-p0 :004 > BSON::ObjectId.new().to_json
     => "{\"$oid\": \"4f173512add361e91d000002\"}" 
    

    【讨论】:

      【解决方案3】:

      BSON (http://bsonspec.org/) 是 JSON (http://www.json.org/) 的二进制表示。 JSON 不是用来描述函数的,因为它是可移植的。这种方式的功能不能移植到其他系统。所以没有办法序列化它。这里定义了一些技巧,可能会得到你需要的东西,但最终,如果你尝试序列化函数,BSON/JSON 可能是一个奇怪的工具。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-20
        • 2014-08-05
        • 2019-09-16
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        • 2015-01-03
        相关资源
        最近更新 更多