mongodb查询嵌入的doc密钥作为日期

时间:2013-05-08 21:39:48

标签: java mongodb

这是我的mongodb文档,带有嵌入式文档。 “事件”是文档列表(BasicDBList),其中每个文档与密钥一起存储为某个日期(例如2013年1月1日),值是一堆字段。结构以这种方式定义,因此我可以在某个日期(例如2013年1月1日)发生所有事件。

我有两个问题:

  1. 是否有更好的方法来构建此文档?我不确定关键 作为约会是一个好主意,但同时我想 轻松检索所有文档并根据日期将它们存储在内存中。什么时候 我检索文档,我想要一个带密钥的Hashtable作为日期和值 作为该日期的文件清单(使用Java)。

  2. 如何通过传递日期来检索文档?例如,我想要 所有带密钥的文件都是2013年1月1日。查询是什么 在Java?

  3. {  
      "_id": {  
        "_time": 1367928493,  
        "_machine": -1914548796,  
        "_inc": -1784811303,  
        "_new": false  
      },  
      "email": "xyz@yahoo.com",  
      "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"
          }
        ]
      }
    }
    

    { "_id": { "_time": 1367928493, "_machine": -1914548796, "_inc": -1784811303, "_new": false }, "email": "xyz@yahoo.com", "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" } ] } }

    谢谢

1 个答案:

答案 0 :(得分:1)

通常,不允许您通过json密钥进行查询,但您可以使用此技巧:

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

此查询是查找具有特定密钥的文档

但是,我认为这不是解决问题的最佳方法。首先,文档的事件对象似乎将来会变得无法预测,这是我们在设计模式时应该避免的,因为随着文档的增长,mongodb必须重新定位磁盘空间来存储它,这将导致性能问题。

我建议将事件对象存储在单独的集合中,“所有者”和“日期”字段是您要查询的字段。

{ 
  "owner":"xyz@yahoo.com",
  "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"  
    }
  ]
}