从MongoDB查询唯一年份

时间:2013-12-10 18:57:03

标签: c# mongodb linq database

我希望从MongoDB中选择不同的年份。我可以使用大于或小于时间的查询来执行查询,并返回完整日期对象,但在这种情况下,我希望获得字段timestamp中唯一年份的字符串列表。

_dbClient = new MongoClient();
_dbServer = _dbClient.GetServer();
_dbDatabase = _dbServer.GetDatabase("test");
_collectionSamples = _dbDatabase.GetCollection<Sample>("samples");

var samples = _collectionSamples.findAll().Distinct(...);

我要查询的课程是

[BsonIgnoreExtraElements]
[DataContract]
public class NeuralSample
{
    [DataMember]
    public ObjectId _id
    {
        get;
        set;
    }

    [DataMember]
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime timestamp
    {
        get;
        set;
    }

    [DataMember]
    public float alpha_low
    {
        get;
        set;
    }
}

我相信,在Distinct中,我需要使用字段“timestamp”,尽管这将返回所有时间戳(数万个结果),而不仅仅是年份(1到2个结果)。

我可以通过命令行界面使用

来完成(或至少通过几次迭代拉出我想要的数据)
db.samples.aggregate([
    { $group : 
        { _id : 
            { year : { $year : "$timestamp" } }, 
            total : { $sum : 1 } 
        }
    }])

这给了我一个包含样本的所有年份的数组,以及一系列计数。多年来,这是最高级别的查询,这很好,但在某些时候我会想要查询年份'x'中的样本,都使用C#驱动程序。任何帮助将不胜感激。


我环顾四周,这是我能找到的最接近我的问题
Select Distinct

谢谢!

1 个答案:

答案 0 :(得分:0)

你打算按月分组吗?如果是这样,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) }
            }
        }
    });