0

У меня есть запрос, который выполняется, как ожидается, когда он выполняется непосредственно в MongoDB, но я столкнулся с некоторыми проблемами, пытаясь заставить его работать через MongoEngine.Почему этот запрос агрегации работает в MongoDB из командной строки, но не через MongoEngine?

РАЗВИТИЯ СРЕДЫ

  1. MongoDB 3.0.7
  2. Mongoengine 0,10
  3. PyMongo 3.1
  4. Джанго 1.8.4

исходного запроса

Этот запрос отлично работает в MongoDB при выполнении из командной строки, получая множество результатов.

db.collection.aggregate([{$project: { 
     "variant":1, 
     "version":1, 
     "date":1, 
      "quarter":{$cond:[{$lte:[{$month:"$date"},3]}, 
         "Q1", 
         {$cond:[{$lte:[{$month:"$date"},6]}, 
           "Q2", 
           {$cond:[{$lte:[{$month:"$date"},9]}, 
             "Q3", 
             "Q4"]}]}]}}},{$group:{"_id":{"quarter":"$quarter", "year":{$year:"$date"}}, 
    "total":{$sum:1}, 
    "details":{$push:{ 
    variant:"$variant", 
    version:"$version", 
    date:"$date" }}}}]) 

MONGOENGINE QUERY

Это моя попытка сделать его работу в MongoEngine. Он выбрасывает ошибку «элемент конвейера 1 не является объектом».

Collection.objects.aggregate([{"$project": { 
     "variant":1, 
     "version":1, 
     "date":1, 
     "quarter":{"$cond":[{"$lte":[{"$month":"$date"},3]}, 
        "Q1", 
        {"$cond":[{"$lte":[{"$month":"$date"},6]}, 
          "Q2", 
          {"$cond":[{"$lte":[{"$month":"$date"},9]}, 
           "Q3", 
           "Q4"]}]}]}}}, 
    {"$group":{"_id":{"quarter":"$quarter", "year":{"$year":"$date"}}, 
    "total":{"$sum":1}, 
    "details":{"$push":{ 
     "variant":"$variant", 
     "version":"$version", 
     "date":"$date" }}}}]) 

Что я делаю неправильно?

ответ

0

Мне просто нужно было снять скобки и передать параметры, разделенные запятыми, агрегированному методу.

project = {"$project": { 
     "variant":1, 
     "version":1, 
     "date":1, 
     "quarter":{"$cond":[{"$lte":[{"$month":"$date"},3]}, 
        "Q1", 
        {"$cond":[{"$lte":[{"$month":"$date"},6]}, 
          "Q2", 
          {"$cond":[{"$lte":[{"$month":"$date"},9]}, 
           "Q3", 
           "Q4"]}]}]}}} 
group = {"$group":{"_id":{"quarter":"$quarter", "year":{"$year":"$date"}}, 
    "total":{"$sum":1}, 
    "details":{"$push":{ 
     "variant":"$variant", 
     "version":"$version", 
     "date":"$date" }}}} 

queryset = Collection.objects.aggregate(project, group) 
Смежные вопросы