Ruby漂亮打印BSON文档?

时间:2018-01-21 18:02:04

标签: ruby mongodb bson

我正在使用Ruby在MongoDB中打印出BSON文档。这是使用MongoDB的Ruby包装器完成的。

  client[:test].find().each do |doc|
    puts doc.to_json()
  end

find方法返回BSON文档。对于使用to_json方法的字符串,可以converted

输出如下:

{"_id":{"$oid":"5a64d2ce36ab1f1ea4b06228"},"admin":"1234","users":"12345","house":{"a":0,"b":0,"c":0},"room":{"a":0,"b":2,"c":1}}

输出不是人类可读的。虽然我可以使用一些正则表达式魔法将上面的字符串格式化为更易于理解的东西,但是有一种更简单的方法可以很好地格式化BSON文档,格式如下:

_id: #
"admin": "1234"
"users": "12345"
"house":
  "a": 1
  "b": 2

我尝试了以下StackOverflow链接。但是,答案会为attributes产生无方法错误,并且在评论后替换为keys只会打印,而不是

2 个答案:

答案 0 :(得分:1)

虽然之前我还没有使用过mongodb或BSON,但如果我们从JSON角度来看这个问题,那么你有两个选择。首先,它不是调用doc.to_json,而是使用方法as_json来获取哈希表示,然后变成一个字符串,因此我们将doc.as_json用作doc = {"_id":{"$oid":"5a64d2ce36ab1f1ea4b06228"},"admin":"1234","users":"12345","house":{"a":0,"b":0,"c":0},"room":{"a":0,"b":2,"c":1}} 而是一个起点。

require 'pp'
pp doc
# Outputs:
# {:_id=>{:$oid=>"5a64d2ce36ab1f1ea4b06228"},
#  :admin=>"1234",
#  :users=>"12345",
#  :house=>{:a=>0, :b=>0, :c=>0},
#  :room=>{:a=>0, :b=>2, :c=>1}}

第一种方法是使用PP库,它是ruby的漂亮打印机:

pp

接近你想要的,#pretty_print(pp)库有一种方法可以通过在你的类中定义一个require 'json' puts JSON.pretty_generate(doc) # { # "_id": { # "$oid": "5a64d2ce36ab1f1ea4b06228" # }, # "admin": "1234", # "users": "12345", # "house": { # "a": 0, # "b": 0, # "c": 0 # }, # "room": { # "a": 0, # "b": 2, # "c": 1 # } # } 函数来定义一个自定义输出,你可以使用它来帮助它完成剩下的工作。方式。

要研究的第二个选项是JSON.pretty_generate

puts JSON.pretty_generate(doc).delete('{},').gsub(/\n\s*\n/, "\n")

这更接近你想要的东西。通过一些后处理,您可以删除那些括号和逗号,如果您愿意:

attributes

至于为什么从keys切换到keys开始只输出attributes,好keys看起来和听起来像是一个哈希,因此循环通过你有每次传递给块的2个元素,public_send(key)听起来像一个数组,所以你只能获得属性的名称。如上所述,我不知道mongo,但是您需要以某种方式使用模型上指定的键来查找属性以获得它的价值。例如,在ActiveRecord中,如果您无法使用其attributes方法,则可以使用{{1}}。

答案 1 :(得分:1)

使用Awesome Print

一旦你将BSON转换为Ruby Hash,你就有很多选择。其中一个是使用Awesome Print gem来使用各种可配置选项来打印哈希对象。例如:

require 'awesome_print'

hash = {:_id=>{:$oid=>"5a64d2ce36ab1f1ea4b06228"},
        :admin=>"1234",
        :users=>"12345",
        :house=>{:a=>0, :b=>0, :c=>0},
        :room=>{:a=>0, :b=>2, :c=>1}}
ap h, indent: 2, index: false
{
    :_id => {
    :$oid => "5a64d2ce36ab1f1ea4b06228"
  },
  :admin => "1234",
  :users => "12345",
  :house => {
    :a => 0,
    :b => 0,
    :c => 0
  },
   :room => {
    :a => 0,
    :b => 2,
    :c => 1
  }
}

另请注意,漂亮打印的PP classautomatically loaded in Ruby 2.5.0。在某些情况下,pp some_hash可能就是您所需要的。 YMMV。