MongoDB wire protocol

MongoDB общается через OP_MSG (с версии 3.6). Все команды — BSON-документы поверх TCP (порт 27017). До 3.6 был zoo из OP_QUERY, OP_INSERT, OP_UPDATE, OP_DELETE, OP_GET_MORE.

Формат сообщения

Message {
  header: {
    messageLength: int32,
    requestID:     int32,
    responseTo:    int32,
    opCode:        int32   // 2013 = OP_MSG
  },
  flagBits: uint32,
  sections: [Section...]
}

Section {
  kind: byte,       // 0 = body, 1 = doc sequence
  payload: BSON | ...
}

Команда = BSON-документ

# find
{
  "find": "users",
  "filter": { "age": { "$gte": 18 } },
  "sort":   { "name": 1 },
  "limit":  10,
  "$db":    "shop"
}

# insert
{
  "insert": "users",
  "documents": [ {"name":"Vasya"} ],
  "$db": "shop"
}

# update
{
  "update": "users",
  "updates": [ {"q": {"_id":1}, "u": {"$set":{"age":30}}} ],
  "$db": "shop"
}

Cursors

Большой результат не сразу. Первый ответ = cursorId + первый batch. Клиент шлёт getMore для следующих. Cursor протухает через 10 мин без активности.

Compression

OP_COMPRESSED (opcode 2012) оборачивает OP_MSG. Алгоритмы: snappy, zstd, zlib. Согласуется в handshake.

Handshake / hello

Клиент → сервер: OP_MSG { "hello": 1, "$db": "admin", "client": {...} }

Сервер → клиент: {
  "isWritablePrimary": true,
  "topologyVersion": {...},
  "maxWireVersion": 21,
  "compression": ["snappy","zstd"],
  "saslSupportedMechs": ["SCRAM-SHA-256"]
}

Аутентификация

Change streams

Real-time поток изменений через aggregate + $changeStream. Клиент держит cursor, сервер шлёт batch при каждой записи. Аналог logical replication.

Transactions

С 4.0 — multi-document transactions. Session-scoped. В команде lsid (logical session id) + txnNumber. Commit через commitTransaction.

Sharding и mongos

mongos — прокси перед shards. Клиент общается только с mongos, тот роутит по shard key.

Совместимые

См. также

← на главную