当前位置: 首页 > 编程语言 > C#

Mongodb按日期聚合分享

时间:2023-04-10 15:27:43 C#

Mongodb按日期聚合我正在写一个函数,我需要按日期分组。这是我目前的做法://假设这是我在集合中的示例文档{"_id":ObjectId("56053d816518fd1b48e062f7"),"memberid":"7992bc31-c3c5-49e5-bc40-0a5ba41af0bd","sourceid":NumberInt(3888),“ispremium”:假,“createddate”:{“DateTime”:ISODate(“2015-09-25T12:26:41.157+0000”),“Ticks”:NumberLong(635787808011571008)},“细节”:{//alargesub-document}}给定会员ID、开始日期和结束日期;我需要在集合中搜索与这些过滤器的匹配项,并按日期对结果进行分组。换句话说,我需要实现的结果是一个列表(例如,12/10/2015-计数为5、13/10/2015-计数为2)。StartDate和EndDate属于DateTime类型。C#是我使用的编程语言,目前我的写法是:varbuilder=Builders.Filter;varfilter=builder.Eq(d=>d.MemberId,memberId)&builder.Gte(d=>d.CreatedDate,startDate)&builder.Lt(d=>d.CreatedDate,endDate.AddDays(1));vargroup=collection.Aggregate().Match(filter).Group(newBsonDocument{{"_id","$createddate"},{"count",newBsonDocument("$sum",1)}}).ToListAsync()。结果;然后我将结果反序列化为自定义类...Listgrouped=group.Select(g=>BsonSerializer.Deserialize(g)).OrderBy(g=>g.Date).ToList();这段代码失败的明显地方是分组部分。在我的例子中,按日期而不是日期时间分组是理想的。我在这里阅读了组文档和一些类似的线程,但不幸的是,我无法让它工作。我的尝试之一是按照文档中的建议进行操作。原始的mongo查询是:db.mycollection.aggregate([{$group:{_id:{month:{$month:"$createddate"},day:{$dayOfMonth:"$createddate"},year:{$year:"$createddate"}},count:{$sum:1}}}])为了完成这项工作,我省略了$match。我得到的例外是“无法从BSON类型对象转换为日期”。总之,我当前的代码有效,但基于一组DateTime(而不仅仅是日期),它最终会在特定日期单独计算。我很好奇这是否可能。未知是我的mongo部分,因为我还没有想出如何做到这一点。(即使在原始的mongo查询中)。只是为了澄清一些附加信息,我在C#中为日期时间对象提供了以下数据注释(不确定这是否会影响):[BsonDateTimeOptions(Representation=BsonType.Document)]publicDateTimeCreatedDate{get;放;我认为一个解决方案是,是否可以动态投影“createddate”字段并将其格式化为“Ymd”并按投影字段分组。我试图在我到目前为止所做的事情中添加尽可能多的细节,只是为了让它更清楚。我希望这不会造成任何混乱。我很感激任何能帮助我产生我想要的结果的帮助/建议。谢谢!根据@chridam的评论,我能够修复它。再次感谢!我正在写下面的解决方案,以防万一,如果有人遇到我遇到的同样问题。我改变了我的查询,这样我就变成了:$createddate.DateTime")},{"日",newBsonDocument("$dayOfMonth","$createddate.DateTime")},{"年",newBsonDocument("$year","$createddate.DateTime")}}},{"count",newBsonDocument("$sum",1)}}).ToListAsync().Result;这给了我一个序列化的对象。然后我将它反序列化为我的自定义类:vargrouped=group.Select(g=>BsonSerializer.Deserialize(g));这是自定义类定义,有点夸张:publicclassId{publicintmonth{get;放;}publicintday{get;放;}publicintyear{get;放;}}publicclassRootObject{publicId_id{get;放;}publicintcount{得到;放;我希望这会很有用。谢谢!?以上就是C#学习教程:所有内容在Mongodb中按日期汇总分享。侵权请点击右侧联系管理员删除。如需转载请注明出处: