2013-12-10 83 views
0

我期待从MongoDB中选择不同的年份。我可以基于大于或小于时间的查询来完成查询,查询返回完整日期对象,但在这种情况下,我想从字段timestamp获取唯一年份的字符串列表。从MongoDB查询唯一年份

_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; 
    } 
} 

我相信,在鲜明的,我需要使用字段“时间戳”尽管这将返回所有时间戳(结果数万名),而不是仅仅几年(1至2个结果)。

我能做到这一点通过使用

db.samples.aggregate([ 
    { $group : 
     { _id : 
      { year : { $year : "$timestamp" } }, 
      total : { $sum : 1 } 
     } 
    }]) 

这给我的一切,我有样品多年的阵列的命令行界面(或至少一对夫妇反复拉出我想要的数据) ,连同计数清单。多年来,最高级别的查询,这是很好的,但在某些时候,我会想要在年份'x'中查询样本的月份,全部使用C#驱动程序。任何帮助将不胜感激。


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

谢谢!

+0

聚集查询是正确的做法。为什么这会成为几个月的问题?只需使用$ match过滤第一个到“x”年的日期,然后用$月做同样的$组。 –

+0

@AsyaKamsky我可以做聚合,但我似乎无法得到它在C#驱动程序中工作,我找不到任何有用的例子,在哪里应用2个过滤器,年份和月份,以聚合。 – clamport

+0

我不明白你的意思是两个过滤器 - 你不会只是做日期范围比较吗? $ match与find基本上具有相同的语法。 –

回答

0

您是否希望按年份分组。如果是从外壳下面的工作

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) } 
      } 
     } 
    });