C# 如何只按年份过滤?
我想查找与给定年份匹配的文档 我正在使用MongoDb.Driver,目前我需要这个库的解决方案C# 如何只按年份过滤?,c#,mongodb,C#,Mongodb,我想查找与给定年份匹配的文档 我正在使用MongoDb.Driver,目前我需要这个库的解决方案 int年=2019年; var filter=Builders.filter.Eq(x=>x.DateOfCreation.Year,Year); var response=await Collection.Find(filter.FirstOrDefaultAsync(); 异常显示:“无法确定x=>x.DateOfCreation.Year的序列化信息。” 我希望输出为一个文档,该文档的年份等
int年=2019年;
var filter=Builders.filter.Eq(x=>x.DateOfCreation.Year,Year);
var response=await Collection.Find(filter.FirstOrDefaultAsync();
异常显示:“无法确定x=>x.DateOfCreation.Year的序列化信息。”
我希望输出为一个文档,该文档的年份等于我的变量,无论日期的其他部分是什么,您都必须按范围搜索:
int year = 2019;
DateTime startDate = new DateTime(year, 1, 1);
DateTime endDate = new DateTime(year + 1, 1, 1);
var filter = Builders<CubesDataMdb>.Filter.Gte(x => x.DateOfCreation, startDate)
& Builders<CubesDataMdb>.Filter.Lt(x => x.DateOfCreation, endDate);
var response = await Collection.Find(filter).FirstOrDefaultAsync();
int年=2019年;
DateTime startDate=新的日期时间(年,1,1);
DateTime endDate=新的日期时间(年份+1,1,1);
var filter=Builders.filter.Gte(x=>x.DateOfCreation,startDate)
&Lt(x=>x.DateOfCreation,endDate);
var response=await Collection.Find(filter.FirstOrDefaultAsync();
因此,我们在这里确定了两个日期:
2019/01/01
和2020/01/01
。然后,我们可以搜索日期大于或等于2091/01/01
和小于2020/01/01
的所有记录,因为已经回答了这个问题。我将提供一种替代方法供将来参考(如果有人需要)
首先,该问题无法确定x=>x.DateOfCreation.Year的序列化信息
出现此错误的原因是c#
驱动程序正在翻译给定的linq语句:
int year = 2019;
var filter = Builders<CubesDataMdb>.Filter.Eq(x => x.DateOfCreation.Year, year);
var response = await Collection.Find(filter).FirstOrDefaultAsync();
因此,Mongodb c#驱动程序无法将其映射到任何字段,因为类CubesDataMdb
或数据库中存储的任何文档中都不存在字段{document}{DateOfCreation}.Year
(ps更简单的解释是,MongoDB
不支持field.Year
的linq转换语法)
因此,除了提供的答案之外,还有另一种方法
聚合:
使用与模型CubesDataMdb
具有相同属性的ViewModel
public int Year { get; set; }
然后,通过使用$year
从对象DateOfCreation
中提取年份部分(假设DateOfCreation
具有mongo日期而非字符串日期),构建一个要在聚合管道中使用的$addFields
阶段,如下所示:
是
DateOfCreation
astring
在您的数据库中,如果这是正确的,那么您无法从string date
中获取Year
值。这是日期格式。我已经发布了一个响应。希望这能澄清DateOfCreation.Year
不起作用的原因。这对我来说很有效!感谢您的帮助!谢谢
public int Year { get; set; }
BsonDocument expressionString = new BsonDocument(new List<BsonElement>() {
new BsonElement("Year", new BsonDocument(new BsonElement("$year", "$DateOfCreation"))),
});
BsonDocument addFieldsStageMongo = new BsonDocument(new BsonElement("$addFields", expressionMongo));
//adding the stage to the aggrigation pipeline
var response = await Collection
.Aggregate()
.AppendStage<BsonDocument>(addFieldsStageMongo)
.Match(m=>m.Year == year)//using the filter on the newly added field of pipeline
.FirstOrDefaultAsync();
db.Collection.aggregate([
{$addFields:{
Year:{$year:"$DateOfCreation"}
}},
{
$match:{
"Year":2019
}
}
])