클래스: Mongo::Protocol::Msg Private

상속:
메시지 모두 표시
다음을 포함합니다.
Monitoring::Event::Secure
다음에 정의됨:
lib/mongo/protocol/msg.rb

개요

이 클래스는 비공개 API의 일부입니다. 이 클래스는 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

MongoDB 유선 프로토콜 메시지 메시지(OP_MSG)는 양방향 유선 프로토콜 옵코드입니다.

OP_MSG는 MongoDB 3.6 (maxWireVersion >= 6) 이상에서만 사용할 수 있습니다.

이후:

  • 2.5.0

네임스페이스 아래에 정의됨

클래스: 섹션 1

상수 요약 접기

DATABASE_IDENTIFIER =

이 상수는 비공개 API의 일부입니다. 이 상수는 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

명령을 실행할 데이터베이스 이름의 식별자입니다.

이후:

  • 2.5.0

'$db'.동결
INTERNAL_KEYS =

이 상수는 비공개 API의 일부입니다. 이 상수는 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

드라이버가 명령에 추가하는 키입니다. 더 나은 로깅을 위해 해시 끝으로 이동합니다.

이후:

  • 2.5.0

세트.신규(%w($clusterTime $db lsid 서명 txnNumber)).동결

Monitoring::Event::Secure에 포함된 상수

Monitoring::Event::Secure::REDACTED_COMMANDS

메시지에서 상속된 상수

Mongo::Protocol::Message::BATCH_SIZE, Mongo::Protocol::Message::COLLECTION, Mongo::Protocol::Message::LIMIT, Mongo::Protocol::Message::MAX_MESSAGE_SIZE, Mongo::Protocol:: Message::ORDERED, Mongo::Protocol::Message::Q

인스턴스 속성 요약

메시지에서 상속된 속성

#request_id

인스턴스 메서드 요약 접기

Monitoring::Event::Secure에 포함된 메서드

#compression_allowed?, #redacted, #sensitivity?

메시지에서 상속된 메서드

#==, 역직렬화, #hash, #maybe_inflate, #set_request_id

ID에 포함된 메서드

포함

생성자 세부 정보

#initialize(플래그, 옵션, main_document, *sequences) ⇒ Msg

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

새 OP_MSG 프로토콜 메시지 생성

예시:

OP_MSG 유선 프로토콜 메시지 만들기

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

매개변수:

  • flags (Array<기호>)

    플래그 비트입니다. 현재 지원되는 값은 :more_to_com 및 :checksum_present입니다.

  • 옵션 (해시)

    옵션.

  • main_document (BSON::Document, Hash)

    페이로드 유형 0 섹션이 될 문서 입니다. OP_MSG 사양에 정의된 글로벌 인수를 포함할 수 있습니다.

  • 시퀀스 (Protocol::Msg::Section1)

    페이로드 유형 1 섹션이 0개 이상입니다.

옵션 해시(options):

  • validation_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
# 파일 'lib/ Mongo/ 프로토콜/msg.rb', 줄 66

def 초기화(flags, 옵션, main_document, *시퀀스)
  만약 flags
    flags. do |flag|
      하지 않는 한 KNOWN_FLAGS.키?(flag)
        올리다 ArgumentError, "Unknown 플래그: #{플래그.검사}"
      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?(섹션 1)
      올리다 ArgumentError, "모든 시퀀스는 섹션1 인스턴스여야 하며, 다음을 얻습니다: #{섹션} at index #{index}"
    end
  end
  @sequences = 시퀀스
  @sections = [
    {유형: 0, 페이로드: @main_document}
  ] + @sequences.map do |섹션|
    {유형: 1, 페이로드: {
      identifier: 섹션.식별자,
      시퀀스: 섹션.문서.map do |doc|
        캐싱 해시.신규(doc)
      end,
    }}
  end
  @request_id = nil
  super
end

인스턴스 메서드 세부 정보

#bulk_write?부울

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

참고:

이 메서드는 클라이언트 사이드 암호화 기능을 지원 하기 위해 작성되었습니다. 이 메서드는 다른 기능 이나 동작을 지원하는 데 사용하지 않는 것이 좋습니다.

이 메시지가 대량 쓰기를 나타내는지 여부입니다. 대량 쓰기는 동일한 유형의 여러 작업을 포함하는 삽입, 업데이트 또는 삭제 작업입니다.

반환합니다:

  • (부울)

    이 메시지가 대량 쓰기를 나타내는지 여부입니다.

이후:

  • 2.5.0



272
273
274
275
276
277
278
279
280
281
282
# 파일 'lib/ Mongo/ 프로토콜/msg.rb', 줄 272

def bulk_write?
  삽입 = @main_document['documents']
  업데이트 = @main_document['updates']
  deletes = @main_document['deletes']

  num_inserts = 삽입 && 삽입.분량 || 0
  num_updates = 업데이트 && 업데이트.분량 || 0
  num_deletes = deletes && deletes.분량 || 0

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

문서 #개 ⇒ 객체

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

이후:

  • 2.5.0



196
197
198
# 파일 'lib/ Mongo/ 프로토콜/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
# 파일 'lib/ Mongo/ 프로토콜/msg.rb', 줄 184

def fix_after_deserialization
  만약 @sections.nil?
    올리다 NotImplementedError, "역직렬화 후 @sections가 초기화되어야 합니다"
  end
  만약 @sections.분량 != 1
    올리다 NotImplementedError, "역직렬화는 정확히 하나의 섹션을 생성했을 것이지만 #{섹션.길이} 섹션을 생성했습니다"
  end
  @main_document = @sections.first
  @sequences = []
  @sections = [{유형: 0, 페이로드: @main_document}]
end

#may_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
# 파일 'lib/ Mongo/ 프로토콜/msg.rb', 줄 284

def may_add_server_api(server_api)
  충돌 = {}
  %i(apiVersion apiStrict apiDeprecationErrors). do ||
    만약 @main_document.키?()
      충돌[] = @main_document[]
    end
    만약 @main_document.키?(.to_s)
      충돌[] = @main_document[.to_s]
    end
  end
  하지 않는 한 충돌.비어 있나요?
    올리다 오류::ServerApiConflict, "클라이언트가 :server_api 옵션으로 구성되었지만 작업에서 다음과 같은 충돌하는 매개 변수를 제공했습니다: #{conflicts.검사}"
  end

  main_document = @main_document.merge(
    Utils.transformation_server_api(server_api)
  )
  메시지.신규(@flags, @options, main_document, *@sequences)
end

#may_compress(압축기, zlib_compression_level = nil) ⇒ 메시지

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

전송 중인 명령이 압축을 허용하는 경우 메시지를 압축합니다. 그렇지 않으면 자체를 반환합니다.

매개변수:

  • 압축기 (string, 기호)

    사용할 압축기입니다.

  • zlib_compression_level (정수) (기본값: nil)

    사용할 zlib 압축 수준입니다.

반환합니다:

  • (메시지)

    이 메시지의 압축 가능 여부에 따라 Protocol::Compressed 메시지 또는 자체 메시지를 반환합니다.

이후:

  • 2.5.0



174
175
176
# 파일 'lib/ Mongo/ 프로토콜/msg.rb', 줄 174

def may_compress(압축기, zlib_compression_level = nil)
  compress_if_posible(명령..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
# 파일 'lib/ Mongo/ 프로토콜/msg.rb', 줄 251

def may_decrypt(컨텍스트)
  만약 컨텍스트.해독?
    cmd = merge_sections
    enc_cmd = 컨텍스트.암호 해독(cmd)
    메시지.신규(@flags, @options, enc_cmd)
  other
    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
# 파일 'lib/ Mongo/ 프로토콜/msg.rb', 줄 214

def may_encrypt(연결, 컨텍스트)
  # TODO는 나중에, 즉 이 메서드가 실행될 때 압축이 발생하는지 확인합니다.
  # 메시지는 압축되지 않습니다.
  만약 컨텍스트.암호화?
    만약 연결.description.max_wire_version < 8
      올리다 오류::CRYPTError.신규(
        "다음보다 오래된 MongoDB 서버 에 대해서는 암호화 를 수행할 수 없습니다." +
        "4.2 ( 8 미만의 유선 버전 ). 현재 서버에 연결되어 있습니다 " +
        "with max 와이어 버전 #{connection.description.max_wire_version}} " +
        "(자동 암호화를 사용하려면 최소 MongoDB 버전이 4.2 이상이어야 함)"
      )
    end

    db_name = @main_document[DATABASE_IDENTIFIER]
    cmd = merge_sections
    enc_cmd = 컨텍스트.암호화(db_name, cmd)
    만약 cmd.키?('$db') && !enc_cmd.키?('$db')
      enc_cmd['$db'] = cmd['$db']
    end

    메시지.신규(@flags, @options, enc_cmd)
  other
    self
  end
end

#number_returned정수

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

서버 에서 반환된 문서 수를 반환합니다.

Msg 인스턴스 는 서버 회신용이어야 하며 회신은 활성 커서 (새로 생성된 커서 또는 getMore를 통해 반복이 계속되는 커서)를 반환해야 합니다.

반환합니다:

  • (정수)

    반환된 문서 수입니다.

다음을 발생시킵니다.

  • (NotImplementedError)

이후:

  • 2.5.0



311
312
313
314
315
316
317
318
319
320
# 파일 'lib/ Mongo/ 프로토콜/msg.rb', 줄 311

def number_returned
  만약 doc = 문서.first
    만약 cursor = doc['cursor']
      만약 배치 = cursor['firstBatch'] || cursor['NextBatch']
        반환 배치.분량
      end
    end
  end
  올리다 NotImplementedError, "number_returned는 커서 응답에 대해서만 정의됩니다"
end

#payloadBSON::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
# 파일 'lib/ Mongo/ 프로토콜/msg.rb', 줄 120

def Payload
  # 더 나은 로깅을 위해 main_document에서 키 재정렬 - 참조
  # https://jira.mongodb.org/browse/RUBY-1591.
  # 재정렬을 하지 않더라도 페이로드는
  # 다음에서 사용된 명령이 있기 때문에 유선을 통해 전송된 내용과 일치합니다.
  # 게시된 이벤트는 여러 섹션의 키를 결합합니다.
  # 페이로드가 유선으로 전송되었습니다.
  ordered_command = {}
  skipped_command = {}
  명령. do |k, v|
    만약 INTERNAL_KEYS.멤버?(k.to_s)
      skipped_command[k] = v
    other
      ordered_command[k] = v
    end
  end
  ordered_command.update(skipped_command)

  BSON::문서.신규(
    command_name: ordered_command..first.to_s,
    database_name: @main_document[DATABASE_IDENTIFIER],
    명령: ordered_command,
    request_id: request_id,
    회신: @main_document,
  )
end

#회신 가능?true, false

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

메시지가 데이터베이스 로부터 응답을 기대하는지 여부입니다.

예시:

메시지에 회신이 필요합니까?

message.replyable?

반환합니다:

  • (true, false)

    메시지에 회신이 필요한 경우.

이후:

  • 2.5.0



108
109
110
# 파일 'lib/ Mongo/ 프로토콜/msg.rb', 줄 108

def 회신 가능?
  @replyable ||= !flags.포함?(:more_to_com)
end

#직렬화(버퍼 = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil) ⇒ BSON::ByteBuffer

이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.

메시지를 유선으로 전송할 수 있는 바이트로 직렬화합니다.

매개변수:

  • buffer (BSON::ByteBuffer) (기본값: BSON::ByteBuffer.new)

    메시지를 삽입해야 하는 위치입니다.

  • max_bson_size (정수) (기본값: nil)

    최대 BSON 객체 크기입니다.

반환합니다:

  • (BSON::ByteBuffer)

    직렬화된 메시지가 포함된 버퍼입니다.

이후:

  • 2.5.0



155
156
157
158
159
160
161
# 파일 'lib/ Mongo/ 프로토콜/msg.rb', 줄 155

def 직렬화(buffer = BSON::ByteBuffer.신규, max_bson_size = nil, bson_overhead = nil)
  validate_document_size!(max_bson_size)

  super
  add_check_sum(buffer)
  buffer
end