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"]
}
Аутентификация
- SCRAM-SHA-1 / SCRAM-SHA-256 — default
- X.509 — mTLS
- LDAP, Kerberos (Enterprise)
- MONGODB-AWS — IAM
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.
Совместимые
- FerretDB — Postgres backend, MongoDB-wire фасад
- Amazon DocumentDB — частичная реализация wire
- Azure Cosmos DB (MongoDB API)