upsert_document_field returned False for an idempotent no-op upsert on an
existing document (modified_count=0, upserted_id=None) even though the doc
matched the requested state; switch to matched_count like its update_document_field
and update_document_operator siblings.
create_documents returned 0 on a partial insert_many failure, discarding the
BulkWriteError's nInserted count and inviting callers to retry the whole batch
on a wrongly-reported failure, duplicating documents that had already landed.
Catch BulkWriteError specifically and return e.details['nInserted'].
Bump to v0.1.7.
Signed-off-by: disqualifier <dev@disqualifier.me>
- mongo-3: create_collection param renamed indexes -> index (it seeds ONE index; a key-spec
builds one compound index, not two). update keyword call sites indexes= -> index=.
- mongo-4: docstring notes an instance is single-use after close() (pymongo 4.x close is
irreversible; connect() only pings).
- mongo-5: docstring notes construction may raise InvalidURI for a malformed URI.
- README: create_collection index note. bump v0.1.5 -> v0.1.6
Signed-off-by: disqualifier <dev@disqualifier.me>
__aenter__ delegated to connect(); when the ping raised on a bad server, __aexit__ was not
called so the eagerly-constructed motor client (with its background topology monitor + pool)
leaked. a retry loop against a flapping DB accumulated live clients. now close-on-failure.
verified: 5 failed async-with blocks leave 0 open clients (was 5). bump v0.1.4 -> v0.1.5
Signed-off-by: disqualifier <dev@disqualifier.me>
additive only — every existing name preserved, swallow contract unchanged. brings mongo
in line with the redis/psql/mysql datastore trio's naming/lifecycle. bump v0.1.3 -> v0.1.4
Signed-off-by: disqualifier <dev@disqualifier.me>
mongo-1: document_push_array and document_push_and_set still returned modified_count>0
while the v0.1.2 wave moved the sibling single-doc update helpers to matched_count>0.
$push always mutates so the two agree in practice (no reachable behavioral change), but
the helpers now match the documented 'True when a document matched' contract uniformly.
sibling-grep: zero consumers of either push helper.
Signed-off-by: disqualifier <dev@disqualifier.me>
- update_document_field/update_document_operator/document_pop_array return
matched_count > 0, so an idempotent write that matched a doc but changed nothing
( to the same value, of an absent value) reports success instead of False
(L19)
- document the bare-proxy escape hatch is mongo.collection(name) not mongo[name], and
that get_document_hashmap/get_document_fields skip docs missing the key (nits).
Signed-off-by: disqualifier <dev@disqualifier.me>
added check_document_exists(collection, target) -> bool (count_documents(target, limit=1) > 0) — it existed only in the talos origin and was not carried over, but the talos caller relies on it. renamed the do_upsert param to upsert on update_document/find_one_and_update/find_one_and_replace, standardizing on motor's name (the talos caller already passes upsert=). param rename is breaking; patch is fine under the no-consumer policy. bump to v0.1.1.
Signed-off-by: disqualifier <dev@disqualifier.me>
close() was async but only called motor's synchronous client.close(), misleading callers into awaiting it; it is now a plain def and the docstring + README examples drop the await. get_document_hashmap/get_document_fields indexed doc[key] unguarded, so a doc missing the field raised KeyError that the broad except swallowed, conflating 'no documents' with 'field absent'; both now skip docs lacking the key.
Signed-off-by: disqualifier <dev@disqualifier.me>
the README install pin used git+https with no git@ prefix or .git suffix, which does not resolve against the SSH-only Gitea remote. corrected to the canonical git+ssh form.
Signed-off-by: disqualifier <dev@disqualifier.me>
point install at git.rethinkstudios.io; show both the requirements.txt
line and the direct pip install command.
Signed-off-by: disqualifier <dev@disqualifier.me>