MongoDB按日期聚合查询组

Chr*_*Geo 5 mongodb aggregation-framework

我在mongoDB中有以下集合

{ _id, startTime, duration }
Run Code Online (Sandbox Code Playgroud)

因此,基本的想法是摄像机可以找到人,一旦它检测到一个人就会保存startTime,一旦一个人消失,就可以节省持续时间.因此,该实体基本上说"一个人出现在X时间,并且在摄像机范围内为Y毫秒".startTime和duration都是数值.

所以,我想执行各种查询,例如:1.给我每月/每年的人数2.给我每月的人数,持续时间> 5000毫秒

等等

虽然我对MongoDB很新,但我对聚合框架有点麻烦,所以如果有人让我知道如何进行如上所述的查询,我会很感激,以便获得某种先发制人的想法. .

编辑:

好吧,我做了几次尝试,但没有运气.现在我的对象有这样的形式:

{
  "_id" : ObjectId("52de407c75895eaf5ea99715"),
  "startTime" : "new Date('02 01 2011 08:36:54')",
  "duration" : 27000
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试这个查询:

 db.collection.aggregate(
        {$project : {
             year : {$year : "$startTime"}

        }},
        {$group : {
             _id : {year : "$year"}, 
             count : {$sum : 1}
        }}
    )
Run Code Online (Sandbox Code Playgroud)

但我得到以下例外:

Error occurred in performing aggregation
Command 'aggregate' failed: exception: can't convert from BSON type String to Date (response: { "errmsg" : "exception: can't convert from BSON type String to Date", "code" : 16006, "ok" : 0.0 })
Type: MongoDB.Driver.MongoCommandException
Stack:    at MongoDB.Driver.Operations.CommandOperation`1.Execute(MongoConnection connection)
   at MongoDB.Driver.MongoCollection.RunCommandAs[TCommandResult](IMongoCommand command, IBsonSerializer resultSerializer, IBsonSerializationOptions resultSerializationOptions)
   at MongoDB.Driver.MongoCollection.RunCommandAs[TCommandResult](IMongoCommand command)
   at MongoDB.Driver.MongoCollection.Aggregate(IEnumerable`1 operations)
   at MangoUI.ComAggregate.kRemove_Click(Object sender, EventArgs e)
Inputs:: 
Command:  aggregate
Ok:       False
ErrorMsg: exception: can't convert from BSON type String to Date
Request:  { "aggregate" : "person", "pipeline" : [{ "$project" : { "year" : { "$year" : "$startTime" } } }, { "$group" : { "_id" : { "year" : "$year" }, "count" : { "$sum" : 1 } } }] }
Response: { "errmsg" : "exception: can't convert from BSON type String to Date", "code" : 16006, "ok" : 0.0 }
Run Code Online (Sandbox Code Playgroud)

Par*_*ade 15

您可以使用Aggregation Framework来完成它们.

给我每月/每年的人数

db.collection.aggregate(
    {$project : {
         year : {$year : "$startTime"}, 
         month : {$month : "$startTime"}
    }},
    {$group : {
         _id : {year : "$year", month : "$month"}, 
         count : {$sum : 1}
    }}
)
Run Code Online (Sandbox Code Playgroud)

给我每月的人数,持续时间> 5000毫秒

db.collection.aggregate(
    {$project : {
         year : {$year : "$startTime"}, 
         month : {$month : "$startTime"}, 
         duration: {$cond: [{$gt: ['$duration', 5000]}, 1, 0]}
    }},
    {$group : {
         _id : {year : "$year",month : "$month"}, 
         duration : {$sum : "$duration"}
    }}
)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请检查聚合框架.