首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何按ID和月份分组?

如何按ID和月份分组?
EN

Stack Overflow用户
提问于 2017-07-24 17:00:15
回答 1查看 440关注 0票数 1

如何在MongoDB中按ID和月份分组?

我的数据如下所示:

代码语言:javascript
复制
{ 
    "_id" : ObjectId("597225c62e7cbfc9a0b099f8"), 
    "LogId" : NumberInt(17351963), 
    "EntryId" : NumberInt(22), 
    "Date" : "2013-08-11 00:00:00", 
    "LogTypeId" : NumberInt(6), 
    "Count" : NumberInt(1), 
    "EntryType" : NumberInt(1)
}
{ 
    "_id" : ObjectId("597225c62e7cbfc9a0b099f9"), 
    "LogId" : NumberInt(17352356), 
    "EntryId" : NumberInt(23), 
    "Date" : "2013-08-11 00:00:00", 
    "LogTypeId" : NumberInt(6), 
    "Count" : NumberInt(2), 
    "EntryType" : NumberInt(1)
}
{ 
    "_id" : ObjectId("597225c62e7cbfc9a0b099fa"), 
    "LogId" : NumberInt(17360483), 
    "EntryId" : NumberInt(28), 
    "Date" : "2013-08-11 00:00:00", 
    "LogTypeId" : NumberInt(6), 
    "Count" : NumberInt(1), 
    "EntryType" : NumberInt(1)
}

我的简化聚合查询运行时没有错误,但它没有分组:

代码语言:javascript
复制
db.log.aggregate([
    {"$group":{"_id":"$EntryId", "Count":{"$sum":"$Count"}}},
    {"$sort": {"EntryId": 1}}
])

最后,我希望按EntryID和日期列的月份进行分组。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-24 17:14:25

首先,通过一个非常简单的操作“将字符串转换为日期”:

代码语言:javascript
复制
let ops = [];

db.log.find().forEach(doc => {
  ops.push({ "updateOne": { 
    "filter": { "_id": doc._id },
    "update": { "$set": { "Date": new Date(doc.Date.replace(" ","T")) } }
  }});

  if ( ops.length >= 500 ) {
    db.log.bulkWrite(ops);
    ops = [];
  }        
});

if ( ops.length > 0 ) {
  db.log.bulkWrite(ops);
  ops = [];
};

然后运行新的聚合:

代码语言:javascript
复制
db.log.aggregate([
  { "$group": {
    "_id": { 
      "EntryId": "$EntryId",
      "year": { "$year": "$Date" },
      "month": { "$month": "$Date" }
    },
    "Count": { "$sum": 1 }
  }},
  { "$sort": { "_id": 1 } }
])

还要注意的是,即使是像这样的“复合_id”也会正确地排序到它的数值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45276323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档