Skip to content

Commit 09c9a88

Browse files
committed
Exact operation, first approach
1 parent 45308d2 commit 09c9a88

File tree

2 files changed

+29
-14
lines changed

2 files changed

+29
-14
lines changed

django_mongodb_backend/fields/embedded_model.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -269,11 +269,13 @@ def preprocess_lhs(self, compiler, connection):
269269

270270
def as_mql(self, compiler, connection):
271271
mql, key_transforms, json_key_transforms = self.preprocess_lhs(compiler, connection)
272-
transforms = ".".join(key_transforms)
273-
result = f"{mql}.{transforms}"
272+
for key in key_transforms:
273+
mql = {"$getField": {"input": mql, "field": key}}
274+
# transforms = ".".join(key_transforms)
275+
# result = f"{mql}.{transforms}"
274276
if json_key_transforms:
275-
result = build_json_mql_path(result, json_key_transforms)
276-
return result
277+
mql = build_json_mql_path(mql, json_key_transforms)
278+
return mql
277279

278280

279281
class KeyTransformFactory:

django_mongodb_backend/fields/embedded_model_array.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from ..forms import EmbeddedModelArrayFormField
2+
from ..query_utils import process_rhs
23
from . import EmbeddedModelField
34
from .array import ArrayField
4-
from .embedded_model import EMFExact
5+
from .embedded_model import EMFExact, KeyTransformFactory
56

67

78
class EmbeddedModelArrayField(ArrayField):
@@ -38,17 +39,29 @@ def formfield(self, **kwargs):
3839
)
3940

4041
def get_transform(self, name):
41-
# TODO: ...
42-
return self.base_field.get_transform(name)
42+
# return self.base_field.get_transform(name)
4343
# Copied from EmbedddedModelField -- customize?
44-
# transform = super().get_transform(name)
45-
# if transform:
46-
# return transform
47-
# field = self.embedded_model._meta.get_field(name)
48-
# return KeyTransformFactory(name, field)
44+
if transform := super().get_transform(name):
45+
return transform
46+
if name.isdigit():
47+
return KeyTransformFactory(name, self)
48+
field = self.embedded_model._meta.get_field(name)
49+
return KeyTransformFactory(name, field)
4950

5051

5152
@EmbeddedModelArrayField.register_lookup
5253
class EMFArrayExact(EMFExact):
53-
# TODO
54-
pass
54+
def as_mql(self, compiler, connection):
55+
mql, key_transforms, json_key_transforms = self.lhs.preprocess_lhs(compiler, connection)
56+
transforms = ".".join(key_transforms)
57+
value = process_rhs(self, compiler, connection)
58+
# return {"$anyElementTrue": []}
59+
# transforms = build_json_mql_path("$$this", key_transforms)
60+
return {
61+
"$reduce": {
62+
"input": mql,
63+
"initialValue": False,
64+
"in": {"$or": ["$$value", {"$eq": [f"$$this.{transforms}", value]}]},
65+
}
66+
}
67+
# return super().as_mql(compiler, connection)

0 commit comments

Comments
 (0)