MongoDriver c# 按日期字段中的月份名称过滤

Posted

技术标签:

【中文标题】MongoDriver c# 按日期字段中的月份名称过滤【英文标题】:MongoDriver c# Filter by month Name from a Date Field 【发布时间】:2021-11-25 13:24:23 【问题描述】:

要求:需要按月份过滤mongo文档(数据以日期时间存储在mongo中)

使用代码: var expenseMonthFilter = Builders<MyDocument>.Filter.Eq(i => i.ExpenseDate.Month, 12);

异常获取:Unable to determine the serialization information for i => i.ExpenseDate.Month.

【问题讨论】:

您是要检索某个月份(例如2021年1月)的所有文档还是要检索各个年份1月的所有文档? 嗨@Markus 所选月份(当年)的所有记录 mongo 中基本查询之外的任何内容通常都需要聚合 【参考方案1】:

在选择一个月的所有文档时,条件需要检索具有GRATERED的所有文档,该文档比或等于月的开始日期,而不是下个月的开始日期,如下所示:

var startOfMonth = new DateTime(selectedYear, selectedMonth, 1, 0, 0, 0, DateTimeKind.Utc);
var startOfNextMonth = startOfMonth.AddMonths(1);
var bldr = Builders<MyDocument>.Filter;
var expenseMonthFilter = bldr.And(
    bldr.Gte(x => x.ExpenseDate, startOfMonth), 
    bldr.Lt(x => x.ExpenseDate, startOfNextMonth));

请注意,在上面的示例中,selectedYear 代表年份,selectedMonth 代表应检索数据的月份。

【讨论】:

【参考方案2】:

默认的 mongo 日期只是一个数字而不是日期,您必须应用外部转换将其转换为日期,为此您需要在查询之前使用聚合来转换数据

一个选项是使用分组来预选数据,即

PipelineDefinition<BsonDocument, BsonDocument> pipeline = new BsonDocument[]

    new BsonDocument("$group", new BsonDocument()
            .Add("_id", new BsonDocument()
                    .Add("month", new BsonDocument()
                            .Add("$month", "$yourDateField")
                    )
            )
            .Add("data", new BsonDocument()
                    .Add("$addToSet", "$$ROOT")
            )), 
    new BsonDocument("$match", new BsonDocument()
            .Add("_id.month", 6.0))
;

如果您只想按月对数据进行分组,那么您不需要匹配阶段,每个组的形式为

_id.nonth:int,
data:<collection of base docs that are in that month>

另一种选择是在匹配之前重新投影每个文档

PipelineDefinition<BsonDocument, BsonDocument> pipeline = new BsonDocument[]

    new BsonDocument("$project", new BsonDocument()
            .Add("month", new BsonDocument()
                    .Add("$month", "$yourDateField")
            )
            .Add("root", "$$ROOT")), 
    new BsonDocument("$match", new BsonDocument()
            .Add("month", 6.0))
;
        

其中任何一个都会被调用

var cursor = await collection.AggregateAsync(pipeline, options)

如果您想包含对 $year 函数的简单调用的年份,例如我有 $month 函数

【讨论】:

以上是关于MongoDriver c# 按日期字段中的月份名称过滤的主要内容,如果未能解决你的问题,请参考以下文章

在输入字段 c# 中的 Unity 上显示从日历中选择的日期

来自外部应用程序的 Access 数据库中日期字段的月份名称(C#)

c#中如何根据一个日期得到这一周的日期

c#中,如何获取日期型字段里的年、月、日?

sql如何按日期中的月份查询

iOS 核心数据总和数据按日期、月份年份