2

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

我有两个问题:

  1. 有没有更好的方法来构建这个文档?我不确定 key 作为日期是一个好主意,但同时我想轻松检索所有文档并根据日期将它们存储在内存中。当我检索文档时,我想要一个哈希表,其中键作为日期,值作为该日期的文档列表(使用 Java)。

  2. 如何通过传递日期来检索文档?例如,我想要键为 2013 年 1 月 1 日的所有文档。Java 中的查询是什么?

{  
  "_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"
      }
    ]
  }
}

谢谢

4

1 回答 1

1

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

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

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

但是,我相信这不是解决您的问题的最佳方法。首先,文档的 events 对象在未来似乎会莫名其妙地增长,这是我们在设计 schema 时应该避免的,因为随着文档的增长,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"  
    }
  ]
}
于 2013-05-09T00:22:38.363 回答