C# 从MongoDB查询唯一年份
我希望从MongoDB中选择不同的年份。我可以基于大于或小于时间进行查询,查询返回完整的日期对象,但在本例中,我希望从字段timestamp获得一个字符串列表,这些字符串是唯一的年份 我相信,在Distinct中,我需要使用字段时间戳,尽管这将返回数万个结果的所有时间戳,而不仅仅是1到2年的结果 我可以这样做,或者至少通过几次迭代,通过命令行界面使用C# 从MongoDB查询唯一年份,c#,mongodb,linq,database,C#,Mongodb,Linq,Database,我希望从MongoDB中选择不同的年份。我可以基于大于或小于时间进行查询,查询返回完整的日期对象,但在本例中,我希望从字段timestamp获得一个字符串列表,这些字符串是唯一的年份 我相信,在Distinct中,我需要使用字段时间戳,尽管这将返回数万个结果的所有时间戳,而不仅仅是1到2年的结果 我可以这样做,或者至少通过几次迭代,通过命令行界面使用 db.samples.aggregate([ { $group : { _id : { yea
db.samples.aggregate([
{ $group :
{ _id :
{ year : { $year : "$timestamp" } },
total : { $sum : 1 }
}
}])
这给了我一个所有年份样本的数组,以及一个计数列表。多年来,这是最高级别的查询,这是很好的,但在某个时候,我会想用“x”年的样本查询月份,所有这些都使用C驱动程序。任何帮助都将不胜感激
我环顾四周,这是我能找到的最接近我的问题
谢谢 您是否希望按月份分组。如果是这样的话,shell中的以下命令将起作用
db.samples.aggregate([
{ $group : {
_id : { year : { $year : "$timestamp" }, month : { $month : "$timestamp" }},
total : { $sum : 1 }
}},
{ $sort : {"_id.year" : 1, "_id.month" : 1}}
])
c中的等效聚合是
var result = _collectionSamples.Aggregate(new BsonDocument
{
{ "$group" , new BsonDocument
{
{ "_id", new BsonDocument
{
{ "year", new BsonDocument("$year", "$timestamp") },
{ "month", new BsonDocument("$month", "$timestamp") }
}
},
{ "total", new BsonDocument("$sum", 1) }
}
}
});
聚合查询是正确的方法。为什么这几个月都会成为一个问题?只需使用$match首先筛选到x年的日期,然后使用$month执行相同的$group。@AsyaKamsky我可以进行聚合,但我似乎无法在C驱动程序中使用它,并且我找不到任何有用的示例来说明在何处应用2个筛选器,年份和月份,总的来说,我不明白你所说的两个过滤器是什么意思-你不只是在做一个日期范围的比较吗$match的语法基本上与find相同。我通过一个有点黑客的变通方法获得了它,使用C查找月份,在特定年份的第一个月和第一天开始查询,并使用一个元素。如果result.timestamp.month小于12,则向该月添加一个,然后从那里开始搜索。
db.samples.aggregate([
{ $group : {
_id : { year : { $year : "$timestamp" }, month : { $month : "$timestamp" }},
total : { $sum : 1 }
}},
{ $sort : {"_id.year" : 1, "_id.month" : 1}}
])
var result = _collectionSamples.Aggregate(new BsonDocument
{
{ "$group" , new BsonDocument
{
{ "_id", new BsonDocument
{
{ "year", new BsonDocument("$year", "$timestamp") },
{ "month", new BsonDocument("$month", "$timestamp") }
}
},
{ "total", new BsonDocument("$sum", 1) }
}
}
});