类:Mongo::Protocol::Msg Private

继承:
message
  • 对象
显示全部
包括:
Monitoring::Event::Secure
定义于:
构建/ruby-driver-v2.19/lib/ mongo / 协议/msg.rb

Overview

此类是私有 API 的一部分。 应尽可能避免使用此类,因为它将来可能会被删除或更改。

MongoDB协议消息 (OP_MSG),双向传输协议操作码。

OP_MSG 仅适用于MongoDB 3.6 (maxWireVersion >= 6 ) 及更高版本。

由于:

  • 2.5.0

在命名空间下定义

类: Section1

常量摘要折叠

DATABASE_IDENTIFIER =

此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。

要对其执行命令的数据库名称的标识符。

由于:

  • 2.5.0

' $db '.冻结
INTERNAL_KEYS =

此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。

驱动程序添加到命令中的键。 这些将被移动到哈希的末尾,以便更好地记录日志。

由于:

  • 2.5.0

.new(%w($clusterTime $db lsid 签名 txnNumber)).冻结

Monitoring::Event::Secure中包含的常量

Monitoring::Event::Secure::REDACTED_COMMANDS

Message继承的常量

Mongo::Protocol::Message::BATCH_SIZEMongo::Protocol::Message::COLLECTIONMongo::Protocol::Message::LIMITMongo::Protocol::Message::MAX_MESSAGE_SIZEMongo::Protocol:: Message::ORDEREDMongo::Protocol::Message::Q

实例属性摘要

Message继承的属性

#request_id

实例方法摘要折叠

Monitoring::Event::Secure中包含的方法

#compression_allowed?#redacted#sensitive?

Message继承的方法

#==deserialize#hash#maybe_inflate#set_request_id

ID中包含的方法

包含

构造函数详情

#initialize (flags, options, main_document, *sequences) =" Msg "

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

创建新的 OP_MSG协议消息

例子:

创建 OP_MSG 传输协议消息

Msg.new([:more_to_come], {}, { hello: 1 },
        { type: 1, payload: { identifier: 'documents', sequence: [..] } })

参数:

  • flags ( Array< Symbol > )

    标志位。 目前支持的值为 :more_to_come 和 :checksum_present。

  • 选项 (哈希)

    选项。

  • main_document ( BSON::Document , Hash )

    将成为有效负载类型0部分的文档。 可以包含 OP_MSG 规范中定义的全局参数。

  • 序列 (Protocol::Msg::Section1)

    零个或多个有效负载类型1部分。

选项哈希 ( options ):

  • validating_keys ( true , false )

    是否应验证密钥是否为有效文档密钥(即 不以 $ 开头且不包含点)。 此选项已弃用,不会使用。 它将在3.0版本中删除。

由于:

  • 2.5.0



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第66行

def 初始化(flags, 选项, main_document, *序列)
  if flags
    flags. do |flag|
      除非 KNOWN_FLAGS.键?(flag)
        提高 ArgumentError, " Unknown flag: #{ flag .inspect } } "
      end
    end
  end
  @flags = flags || []
  @options = 选项
  除非 main_document.is_a?(哈希)
    提高 ArgumentError, "主文档必须是哈希,给定: #{ main_document . class } "
  end
  @main_document = main_document
  序列.each_with_index do |部分, 索引(index)|
    除非 部分.is_a?(Section1)
      提高 ArgumentError, "所有序列必须是部分1实例,得到: #{ section } at index #{ index } "
    end
  end
  @sequences = 序列
  @sections = [
    {类型: 0, 有效负载: @main_document}
  ] + @sequences.map do |部分|
    {类型: 1, 有效负载: {
      identifier: 部分.标识符,
      序列: 部分.文档.map do |doc|
        CachingHash.new(doc)
      end,
    }}
  end
  @request_id = nil
  
end

实例方法详细信息

# bulk_write?布尔

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

注意:

编写此方法是为了支持客户端加密功能。 不建议将此方法用于任何其他功能或行为。

此消息是否表示批量写入。 批量写入是包含多个相同类型操作的插入、更新或删除操作。

返回:

  • ( Boolean )

    此消息是否表示批量写入。

由于:

  • 2.5.0



272
273
274
275
276
277
278
279
280
281
282
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第272行

def bulk_write?
  inserts = @main_document['documents']
  更新 = @main_document['updates']
  删除 = @main_document['deletes']

  num_inserts = inserts && inserts.长度 || 0
  num_updates = 更新 && 更新.长度 || 0
  num_deletes = 删除 && 删除.长度 || 0

  num_inserts > 1  || num_updates > 1 || num_deletes > 1
end

# 个文档对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

由于:

  • 2.5.0



196
197
198
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第196行

def 文档
  [@main_document]
end

#fix_after_deserialization对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

反序列化将 @sections 实例变量设置为文档列表后,反向填充实例变量。

TODO 修复反序列化,以便不需要此方法。

由于:

  • 2.5.0



184
185
186
187
188
189
190
191
192
193
194
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第184行

def fix_after_deserialization
  if @sections.nil?
    提高 NotImplementedError, "反序列化后,@sections 应该已初始化"
  end
  if @sections.长度 != 1
    提高 NotImplementedError, "反序列化必须恰好生成一个节,但它生成了#{ section . length }个节"
  end
  @main_document = @sections.first
  @sequences = []
  @sections = [{类型: 0, 有效负载: @main_document}]
end

#也许_add_server_api (server_api) ⇒对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

由于:

  • 2.5.0



284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第284行

def 也许_add_server_api(server_api)
  冲突 = {}
  %i(apiVersion apiStrict apiDeprecationErrors). do |key|
    if @main_document.键?(key)
      冲突[key] = @main_document[key]
    end
    if @main_document.键?(key.to_s)
      冲突[key] = @main_document[key.to_s]
    end
  end
  除非 冲突.空?
    提高 错误::ServerApiConflict, "客户端配置了 :server_api 选项,但操作提供了以下冲突的参数: #{冲突检查} "
  end

  main_document = @main_document.合并(merge)(
    Utils.transform_server_api(server_api)
  )
  消息.new(@flags, @options, main_document, *@sequences)
end

#maybe_compress (compressor, zlib_compression_level = nil) ⇒消息

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

如果发送的命令允许压缩,则压缩消息。 否则返回 self。

参数:

  • 压缩器 ( string , Symbol )

    要使用的压缩程序。

  • zlib_compression_level 整数 (默认为: nil

    要使用的zlib压缩级别。

返回:

  • (消息)

    Protocol::Compressed 消息或自身,具体取决于此消息是否可以压缩。

由于:

  • 2.5.0



174
175
176
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第174行

def 也许_压缩(压缩器, zlib_compression_level = nil)
  compress_if_possible(命令.密钥.first, 压缩器, zlib_compression_level)
end

#maybe_decrypt(context) ⇒ Mongo::Protocol::Msg

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

可能使用 libmongocrypt 解密此消息。 仅当指定的客户端存在、已为该客户端提供自动加密选项并且此消息符合解密条件时,才会解密消息。 如果一条消息代表 libmongocrypt 允许列出的命令类型之一并且包含需要由本地或远程JSON schema加密的数据,则该消息有资格解密。

参数:

返回:

  • (Mongo::Protocol::Msg)

    解密后的消息,如果无法或无需解密,则为原始消息。

由于:

  • 2.5.0



251
252
253
254
255
256
257
258
259
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第251行

def Maybe_decrypt(上下文)
  if 上下文.解密?
    cmd = merge_sections
    enc_cmd = 上下文.加密器.解密(cmd)
    消息.new(@flags, @options, enc_cmd)
  else
    self
  end
end

#maybe_encrypt(connection, context) ⇒ Mongo::Protocol::Msg

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

可以使用 libmongocrypt 加密此消息。 仅当指定的客户端存在、已为该客户端提供自动加密选项、未指示客户端绕过自动加密并且 mongocryptd 确定此消息符合加密条件时,才会加密消息。 如果一条消息代表 libmongocrypt 允许列出的命令类型之一,并且包含需要由本地或远程JSON schema加密的数据,则该消息符合加密条件。

参数:

返回:

  • (Mongo::Protocol::Msg)

    加密的消息,如果不可能或不需要加密,则为原始消息。

由于:

  • 2.5.0



214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第214行

def 也许_加密(连接, 上下文)
  # TODO 稍后验证压缩,即当此方法运行时
  # 消息未压缩。
  if 上下文.加密?
    if 连接.描述.max_wire_version < 8
      提高 错误::CryptError.new(
        无法对早于以下版本的MongoDB服务器执行加密 +
        " 4.2 (传输版本低于8 )。当前已连接到服务器" +
        " with max line version #{ connection . description . max_wire_version } } " +
        " (自动加密要求 MongoDB 版本最低为4.2 ) "
      )
    end

    db_name = @main_document[DATABASE_IDENTIFIER]
    cmd = merge_sections
    enc_cmd = 上下文.加密器.加密(db_name, cmd)
    if cmd.键?(' $db ') && !enc_cmd.键?(' $db ')
      enc_cmd[' $db '] = cmd[' $db ']
    end

    消息.new(@flags, @options, enc_cmd)
  else
    self
  end
end

# number_returned整数

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回从服务器返回的文档数。

该 msg实例必须用于服务器回复,并且该回复必须返回一个活动游标(新创建的游标或其迭代通过 getMore 继续的游标)。

返回:

  • ( Integer )

    返回文档的数量。

引发:

  • ( NotImplementedError )

由于:

  • 2.5.0



311
312
313
314
315
316
317
318
319
320
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第311行

def number_returned
  if doc = 文档.first
    if cursor = doc[' cursor ']
      if 批处理 = cursor[' firstBatch '] || cursor[' nextBatch ']
        return 批处理.长度
      end
    end
  end
  提高 NotImplementedError,  number_returned 仅为游标回复定义
end

#有效负载BSON::Document

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回用于监控的事件负载。

例子:

返回事件有效负载。

message.payload

返回:

  • ( BSON::Document )

    事件有效负载。

由于:

  • 2.5.0



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第120行

def 有效负载
  # 对 main_document 中的键重新排序,以便更好地进行日志记录 — 请参阅
  # https://jira.mongodb.org/browse/RUBY-{0 1591 .
  # 请注意,即使没有重新排序,有效负载也不是精确的
  # 与通过网络发送的内容匹配,因为该命令用于
  # 已发布的事件结合了来自多个部分的密钥
  # 通过网络发送的有效负载。
  orders_command = {}
  skipped_command = {}
  命令. do |k, v|
    if INTERNAL_KEYS.成员?(k.to_s)
      skipped_command[k] = v
    else
      orders_command[k] = v
    end
  end
  orders_command.update(skipped_command)

  BSON::文档.new(
    command_name: orders_command.密钥.first.to_s,
    database_name: @main_document[DATABASE_IDENTIFIER],
    命令: orders_command,
    request_id: request_id,
    回复: @main_document,
  )
end

#可回复?true , false

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

该消息是否期望从数据库得到回复。

例子:

该消息是否需要回复?

message.replyable?

返回:

  • ( true , false )

    如果消息需要回复。

由于:

  • 2.5.0



108
109
110
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第108行

def 可回复?
  @replyable ||= !flags.包括?(:more_to_come)
end

# Serialize (buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ BSON::ByteBuffer

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

将消息序列化为可以在线发送的字节。

参数:

  • 缓冲 ( BSON::ByteBuffer ) (默认为: BSON::ByteBuffer.new

    消息应插入的位置。

  • max_bson_size 整数 (默认为: nil

    最大BSON对象大小。

返回:

  • ( BSON::ByteBuffer )

    包含序列化消息的缓冲区。

由于:

  • 2.5.0



155
156
157
158
159
160
161
# File 'build/Ruby-driver-v 2.19 /lib/mongo/protocol/msg.rb', 第155行

def 序列化(缓冲 = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil)
  validate_document_size!(max_bson_size)

  
  add_check_sum(缓冲)
  缓冲
end