2012-10-11 49 views
0

我正在將我的博客轉換爲使用/year/month/day類型的URL。儘管我已經遇到了一個非常糟糕的問題。我只想下降到小時/分鐘的分辨率,但是當然,我的所有參賽作品都儘可能保存完整時間(我不想改變這一點)。如何使用MongoDB中的時間數據將年/月/日日期解析爲更具體的日期?

我到底該如何解決一個具體的日期到一個不太具體的日期與MongoDB?我爲.Net使用10gen的官方MongoDB映射器。

我的數據模型是這樣的:

public class BlogEntryData 
{ 
    [BsonId] 
    public ObjectId ID; 
    public string Title; 
    public string Text; 
    public DateTime Posted; 
    public DateTime Edited; 
    public List<string> Tags; 
    [BsonDefaultValue(true)] 
    public bool Publish; 
} 

,我也得到了使用

var c=Config.GetDB().GetCollection<BlogEntryData>("entries"); 
BlogEntryData entry; 
try 
{ 
    entry=c.FindOneByIdAs<BlogEntryData>(new ObjectId(RouteParams["id"])); 
} 
catch 
{ 
    throw new HttpException(404,"Blog entry not found"); 
} 

if(entry==null) 
{ 
    throw new HttpException(404,"Blog entry not found"); 
} 

我知道如何去改變它,而不是使用ID有點像我的博客條目數值搜索領域或其他,但我從來沒有查詢過日期。

另外,順便說一下,在我的輸入模型中存儲非規範化爲字符串的「URL日期」會更好嗎?我只想這樣做,如果索引不能在日期或東西上正常工作

回答

2

您DateTime是否可以在蒙戈表示的語法如下;

ISODate("2012-10-11T17:33:51.994Z") 

這是規範的,可排序的格式。所以它從一年開始,然後是一個月,然後是一天,然後是小時等等,所以它對於大多數特定訂單來說已經是最少的了。有幾件事你可以用這個做。

  1. 只要使用字符串的第一部分,就可以對其進行字符串解析。但這並不太聰明。
  2. 您可以簡單地複製年份和月份作爲單獨的字段,以外的ISODate()。這裏的優點是您可以直接引用這些字段,並且可以專門爲它們編制索引。
  3. 最後,您可以使用範圍進行搜索,因此可以使用該範圍;

db.so.找到({發佈時間:{$ GT:ISODate( 「2012年10月11日」), $ LT:ISODate( 「2012年10月12日」)}})

我不會推薦在1所有,但2和3將工作得很好。

順便說一下,這兩種機制都可以很好地轉化爲C#驅動程序。所以通過更完整的答案;

 var dayOfInterest = new DateTime(2012, 10, 11); 
     var rangeOfInterest = dayOfInterest.AddDays(1); 

// ... 

     var entries = c.FindAs<BlogEntryData>(Query.And(
            Query.GT("Posted", dayOfInterest), 
            Query.LT("Posted", rangeOfInterest) 
         )); 
+0

ISODates存儲在(http://www.mongodb.org/display/DOCS/Dates)作爲'自Unix時代以來的毫秒數'而不是字符串格式。分別安置所有日期部分的索引策略不會超高性能,也會增加您的工作集大小和內存需求以滿足索引和存儲需求以及查詢時間,並且可能使分片更難以強制全局操作數據檢索。最好是僅通過C#代碼所示的標準時間集查詢。 – Sammaye

+0

對不起,再次閱讀我的回覆,我的意思並不是暗示日期存儲爲字符串。實際上他們很長。但我對2和3的建議仍然存在。你是對的RAM。但是存儲非規範化的年份和日期仍然是一種價值方法。這一切都取決於你的查詢模式。我希望在這些選項中你有一個可行的解決方案。親切的態度 – cirrus

+0

只要它被清除了:)否則人們會開始思考第一種方法是可能的。雖然在C#中它可能實際上包含一個'toString'函數,但我不知道,因爲我沒有用C#做MongoDB,但這是依賴於語言的。 – Sammaye

0

在我開始之前,讓我確保我正確理解你的問題。您目前正在以日期/時間格式存儲日期,但希望能夠以不太精細的方式使用和查詢日期。如果這是你想知道的,那麼我對你有一些好消息:在mongodDB中所有這些都很簡單。

首先,您應該閱讀the mongodb cookbook post on this topic以瞭解如何查詢和索引mongodb中的日期。其次,一旦你在c#中有日期,它是(我相信,我試圖確認一些搜索,但仍然不是100%確定)在c#DateTime類。這個類有很多方法可以用來查看不同粒度的日期。有關主題看microsoft documentation

更多信息希望這回答了你的問題,給你,你需要不斷地享受的MongoDB

工具
相關問題