在单个请求中对单个字段分组不同的count()

时间:2014-03-18 22:28:16

标签: mongodb mongoose mongodb-query

有没有办法从单个文档中获得单个字段的不同计数?

以下是文档User

的架构
UserSchema: {
  name: { type: String, required: true },
  created_at: { type: Date, default: now }
}

我想让每个用户创建01/05/2013和06/08/2013,也许我需要计算更多不同的日期。

我可以在count()上获取这些数据,还是应该让所有拥有find()的用户使用javascript对其进行计数?

1 个答案:

答案 0 :(得分:1)

您可以使用接受查询的collection.count()表单,以及$or和范围的使用:

db.collection.count({ "$or": [

   { "created_at": 
       {"$gte": new Date("2014-05-01"), "$lt": new Date("2014-05-02") }
   },
   { "created_at": 
       {"$gte": new Date("2013-08-06"), "$lt": new Date("2013-08-07") }
   }

]})

或者您可以将该查询传递给.find()并根据您的喜好使用光标计数。

但是,我再次读取您的标题,并且不同计数会有所不同,最好使用聚合来获得不同的日期:

db.collection.aggregate([

    // Match the dates you want to filter
    { "$match": {
        { "$or": [
            { "created_at": {
                "$gte": new Date("2014-05-01"),
                "$lt": new Date("2014-05-02")
            }},
            { "created_at": {
               "$gte": new Date("2013-08-06"), 
               "$lt": new Date("2013-08-07") 
            }}
         ]}
    }},

    // Group on the *whole* day and sum the count
    { "$group": {
         "_id": { 
           "year": { "$year": "$created_at" },
           "month": { "$month": "$created_at" },
           "day": { "$dayOfMonth": "$created_at" }
         },
         "count": { "$sum": 1 }
    }}

])

这将为您提供在$or条款中添加的每个选定日期的文档的明确计数。

无需在代码中循环。