【问题标题】:Why does this aggregation query work in MongoDB from command line but not through MongoEngine?为什么这个聚合查询可以从命令行在 MongoDB 中工作,而不是通过 MongoEngine?
【发布时间】:2016-02-06 18:06:14
【问题描述】:

我有一个查询在 MongoDB 中直接执行时按预期运行,但我在尝试通过 MongoEngine 使其工作时遇到了一些麻烦。

开发环境

  1. MongoDB 3.0.7
  2. Mongoengine 0.10
  3. Pymongo 3.1
  4. Django 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 查询

这是我尝试让它在 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"   }}}}])

我做错了什么?

【问题讨论】:

    标签: django mongodb-query pymongo aggregation-framework mongoengine


    【解决方案1】:

    我只需要删除括号并将逗号分隔的参数传递给聚合方法。

    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 )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 2016-01-15
      • 1970-01-01
      相关资源
      最近更新 更多