File: array.py

package info (click to toggle)
python-beanie 2.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,484 kB
  • sloc: python: 14,427; makefile: 6; sh: 6
file content (120 lines) | stat: -rw-r--r-- 2,185 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
from abc import ABC
from typing import Any, Optional

from beanie.odm.operators.find import BaseFindOperator


class BaseFindArrayOperator(BaseFindOperator, ABC): ...


class All(BaseFindArrayOperator):
    """
    `$all` array query operator

    Example:

    ```python
    class Sample(Document):
        results: List[int]

    All(Sample.results, [80, 85])
    ```

    Will return query object like

    ```python
    {"results": {"$all": [80, 85]}}
    ```

    MongoDB doc:
    <https://docs.mongodb.com/manual/reference/operator/query/all>
    """

    def __init__(
        self,
        field,
        values: list,
    ):
        self.field = field
        self.values_list = values

    @property
    def query(self):
        return {self.field: {"$all": self.values_list}}


class ElemMatch(BaseFindArrayOperator):
    """
    `$elemMatch` array query operator

    Example:

    ```python
    class Sample(Document):
        results: List[int]

    ElemMatch(Sample.results, {"$in": [80, 85]})
    ```

    Will return query object like

    ```python
    {"results": {"$elemMatch": {"$in": [80, 85]}}}
    ```

    MongoDB doc:
    <https://docs.mongodb.com/manual/reference/operator/query/elemMatch/>
    """

    def __init__(
        self,
        field,
        expression: Optional[dict] = None,
        **kwargs: Any,
    ):
        self.field = field

        if expression is None:
            self.expression = kwargs
        else:
            self.expression = expression

    @property
    def query(self):
        return {self.field: {"$elemMatch": self.expression}}


class Size(BaseFindArrayOperator):
    """
    `$size` array query operator

    Example:

    ```python
    class Sample(Document):
        results: List[int]

    Size(Sample.results, 2)
    ```

    Will return query object like

    ```python
    {"results": {"$size": 2}}
    ```

    MongoDB doc:
    <https://docs.mongodb.com/manual/reference/operator/query/size/>
    """

    def __init__(
        self,
        field,
        num: int,
    ):
        self.field = field
        self.num = num

    @property
    def query(self):
        return {self.field: {"$size": self.num}}