2013-12-10 82 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) } 
      } 
     } 
    });