9

我有一个如下所示的 MongoDB 聚合:

[
    {
        "$match": [
            {"Created": {"$gte": ISODate("2014-01-10T00:00:00Z")}}
        ]
    },
    {
        "$group":
        {
            "_id": [
                {"year": {"$year": "Created"}},
                {"month": {"$month": "Created"}},
                {"day": {"$dayOfMonth": "Created"}}
            ],
            "count": {"$sum": 1}
        }
    }
]

当我在 MongoVUE 中运行此查询时,它返回以下错误:

管道中的语法不正确
管道中的每个项目都必须是一个文档
类型:系统异常
堆栈:在 MangoUI.ComAggregate.kRemove_Click(Object sender, EventArgs e)

我完全被难住了,从我的谷歌搜索来看,整个互联网的其余部分也是如此。在我添加日期创建 $match 运算符之前,查询正常工作。错误可能属于 MongoVUE 而不是 MongoDB 本身。

架构的相关部分如下所示:

{
  "_id" : new BinData(3, "m13wFpp9gUi09cRCuG43aw=="),
  "Created" : ISODate("2013-12-19T01:00:20.972Z")
}

谁能帮我找出这个错误的原因?恐怕我完全被难住了。


我不允许回答我自己的问题(因为如果您的 StackOverflow 声誉太低,显然不可能在 8 小时内自己找到答案?嗯?)所以我在下面发布了答案:

好的,我找到了答案,据我所知,它确实是 MongoVUE 中的一个错误(或至少是一个遗漏和误导性错误消息)。以这种方式编写相同的查询(带有 orid 的修改)是有效的:

{
  "$match": {
    "Created": {
      "$gte": ISODate("2014-01-10T00:00:00Z")
    }
  }
},
{
  "$group": {
    "_id": {
      "year": {
        "$year": "$Created"
      },
      "month": {
        "$month": "$Created"
      },
      "day": {
        "$dayOfMonth": "$Created"
      }
    },
    "count": {
      "$sum": 1
    }
  }
}

(注意我真正做的唯一改变是删除它周围的数组标记。)

此外,只要您在 MongoVUE 的数组中放置具有多个操作的聚合,就会出现该错误。如果您不使用数组,则操作可以正常工作。如果你添加它,你会突然得到“管道中的每个项目都必须是一个文档”。

4

1 回答 1

4
pipeline = [{
  "$match": {
    "Created": {
      "$gte": ISODate("2014-01-10T00:00:00Z")
    }
  }
},
{
  "$group": {
    "_id": {
      "year": {
        "$year": "$Created"
      },
      "month": {
        "$month": "$Created"
      },
      "day": {
        "$dayOfMonth": "$Created"
      }
    },
    "count": {
      "$sum": 1
    }
  }
}]

Document.objects.aggregate(*pipeline)
于 2017-07-27T10:52:22.957 回答