2013-05-08 36 views
2

這是我與嵌入文檔MongoDB的文檔。 「事件」是一個文檔列表(BasicDBList),其中每個文檔以某個日期(例如2013年1月1日)作爲關鍵字存儲,值是一堆字段。結構是這樣定義的,這樣我就可以在某個日期發生所有事件(例如2013年1月1日)。MongoDB的查詢嵌入文檔鍵日期

我有兩個問題:

  1. 是否有更好的方法來組織這個文件呢?我不知道密鑰 作爲一個日期是一個好主意,但在同一時間我想 輕鬆地檢索所有文件,並根據日期存儲在內存中。當 我檢索文檔時,我想要一個帶有日期和值爲 的鍵作爲該日期的文檔列表(使用Java)的散列表。

  2. 如何取回通過傳遞日期的文件?例如,我想要 所有帶有密鑰的文檔都是2013年1月1日。在Java中,查詢 是什麼?

{ 
    "_id": { 
    "_time": 1367928493, 
    "_machine": -1914548796, 
    "_inc": -1784811303, 
    "_new": false 
    }, 
    "email": "[email protected]", 
    "events": { 
    "Jan 1, 2013": [ 
     { 
     "desc": "My Desc", 
     "title": "My Title", 
     "createDateTime": "May 7, 2013 8:08:13 AM", 
     "updateDateTime": "May 7, 2013 8:08:13 AM" 
     }, 
     { 
     "desc": "My Desc2", 
     "title": "My Title2", 
     "createDateTime": "May 7, 2013 8:08:13 AM", 
     "updateDateTime": "May 7, 2013 8:08:13 AM" 
     } 
    ], 
    "Feb 1, 2013": [ 
     { 
     "desc": "My Desc3", 
     "title": "My Title3", 
     "createDateTime": "May 8, 2013 8:08:13 AM", 
     "updateDateTime": "May 7, 2013 8:08:13 AM" 
     }, 
     { 
     "desc": "My Desc3", 
     "title": "My Title3", 
     "createDateTime": "May 8, 2013 8:08:13 AM", 
     "updateDateTime": "May 8, 2013 8:08:13 AM" 
     } 
    ] 
    } 
} 

謝謝

+0

您是否在特定文檔或跨所有文檔查詢特定日期? – 2013-05-08 21:58:25

+0

我有兩個要求:1)檢索所有日期的所有文檔2)檢索特定日期的所有文檔。 – 2013-05-09 01:07:18

回答

0

通常情況下,你不能用一個JSON鍵進行查詢,但你可以用這一招:

db.things.find({ key : { $exists : true } }); 

這個查詢找到其中有一個特定的鍵

然而,我認爲這個文件是不是在b最好的方法來解決你的問題。首先,文檔的事件對象似乎在將來會變得不可預測,這是我們在設計模式時應該避免的,因爲隨着文檔的增長,mongodb必須重新定位磁盤空間來存儲它,這會導致性能問題。

我建議存儲的事件在一個單獨的集合對象,在「所有者」和「日期」字段,你會通過查詢什麼。

{ 
    "owner":"[email protected]", 
    "date":"Jan 1, 2013", 
    "events":[ 
    { 
     "desc": "My Desc", 
     "title": "My Title", 
     "createDateTime": "May 7, 2013 8:08:13 AM", 
     "updateDateTime": "May 7, 2013 8:08:13 AM" 
    } 
    ] 
} 
+0

當我在你的評論中使用find $ exists:true的時候,我得到了我的問題中所有文檔結構的所有日期事件。但不管如何,我真的很喜歡你的模式建議。它被簡化並且合理。非常感謝。 – 2013-05-09 01:46:37