MongoDB (Pymon go) использует $ group и $ or тот же оператор - PullRequest
0 голосов
/ 30 апреля 2020

Можем ли мы использовать как $ group, так и $ или в одном выражении с агрегацией?

query = [{'$group': { '$or': [{'_id' : "$birthYear", 'count': { '$sum': 1 }}] }}]
by_date = list(mycol.aggregate(query))

Это дает мне следующую ошибку,

pymongo.errors.OperationFailure: The field '$or' must be an accumulator object

Ниже приведен мой пример MongoDB:

db.employee.insert([
    {"id":"1","name": "Ricardo Carpio","age": 24, "gender": "Male", "birthYear" : "1995" , "hobby" : "Reading books"},
    {"id":"2","name": "Alice Salpicao","age": 27, "gender": "Female", "birthYear" : "1992" , "hobby" : "Eating"},
    {"id":"3","name": "Cardo Agustin","age": 25, "gender": "Male", "birthYear" : "1996" , "hobby" : "Jogging"},
    {"id":"5","name": "Gamora Yuchi","age": 24, "gender": "Female", "birthYear" : "1995" , "hobby" : "Singing"},
    {"id":"6","name": "Thanos Pink","age": 29, "gender": "Male", "birthYear" : "1990" , "hobby" : "Collecting gems"}
])

Я пытаюсь сгруппировать счет следующим утверждением:

db.collection.aggregate([
  {
    "$group": {
      "_id": "$birthYear",
      "count": {
        "$sum": 1
      }
    }
  }
])

Это работает хорошо.

Но мне нужно добавить условный поиск по полю, где hobby is Eating с использованием "$or": [hobby: "Eating"]

1 Ответ

0 голосов
/ 30 апреля 2020

Непонятно, что вы пытаетесь сделать, но ответ не меняется независимо.

Итак, $ group может получить 2 поля, _id, которые являются обязательными и должны быть некоторая константа и любое имя поля, которое вычисляется с помощью операторов-аккумуляторов .

Так что $or не является оператором, который означает, что мы можем использовать его только как константу для _id field.

Это будет выглядеть так:

db.collection.aggregate([
    {
        $group: {
            _id: {$or: [cond1, cond2, ...]},
            field: ... accumulator op ...
        }
    }
])

, что приведет к следующему результату:

[
    { // matched true with the $or condition
        _id: true,
        field: [ ... ]
    },
    { // matched false with the $or condition
        _id: false,
        field: [ ... ]
    }
]

Нет другого верхнего уровня использования $or возможно.

...