Ansatz: Sie senden den Befehl vorübergehend an ein sekundäres Mitglied des Replikat -Sets (unter Verwendung von ReadPreference = Secondary ). Wenn der Befehl ohne Fehler ausgeführt wird, handelt es sich um eine Leseoperation. Wenn es mit "nicht primär", "nicht abgeschriebenemPrimary" oder ähnlichen Fehlern/Codes fehlschlägt, ist es ein Schreiben. Das Hauptproblem wäre: Was wäre, wenn ein sekundäres Mitglied nicht vorhanden ist, wenn der Scheck durchgeführt wird, ich überprüft habe und es würde einen Fehler werfen und wir würden daher nicht wissen, ob es sich um eine Lektüre handelt oder nicht.
Code: Select all
OperationFailure
Code: Select all
from pymongo import MongoClient, ReadPreference
from pymongo.errors import NotPrimaryError, OperationFailure
def is_read_command(db, command):
try:
secondary_db = db.with_options(read_preference=ReadPreference.SECONDARY)
secondary_db.command(command)
return True
except (NotPrimaryError, OperationFailure) as exc:
err_msg = str(exc)
if getattr(exc, "code", None) in (10107, 13435) or "not primary" in err_msg.lower() or "not master" in err_msg.lower():
return False
raise