2013-05-08 86 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