【问题标题】:Best way to store and organize data in MongoDB在 MongoDB 中存储和组织数据的最佳方式
【发布时间】:2017-05-10 01:47:41
【问题描述】:

我在 MongoDB 中有一个用户,每个用户都有一个界面,允许他们将当前的饥饿状态设置为“饥饿”、“不饿”、“饥饿”、“饥饿”或“饱”的组合

每个用户可以在任何时间段内输入多个选项。例如,一个用例是“早上,记录我的饥饿感”,用户可以输入“不饿”和“饱”。他们可以在一天中的任何时间记录自己的饥饿程度,想记录多少次都可以。

我是否应该将数据存储为单个条目,然后在以后需要在 UI 中显示时按 MongoDB 中的日期对数据进行分组?还是应该将数据存储为用户选择的选项和日期的数组?

【问题讨论】:

  • 你的第二种方法对我来说听起来更好——你的集合应该是一组文档,每个文档都代表“X 时刻的饥饿状态”,例如 {"hunger":"FULL", "date" : ISODate("2017-05-09T14:20:35.421Z"), "user" : "user@example.com" }。查询起来似乎很简单。但我对自己的知识不够自信,无法从效率的角度评估这一点。
  • 谢谢,这也是我的想法。在 mysql 中,我想我会将每个条目存储为一个,然后根据需要将它们分组。在 MongoDB 中,我想事情有些不同,所以也许将它们组合在一起是一个更好的主意?想知道它还会如何影响性能。

标签: mongodb


【解决方案1】:

这取决于您将来的查询,您可能想要同时执行这两项操作。磁盘空间比处理更便宜,最好将磁盘空间翻倍而不是查询翻倍。

如果您只想按日期进行映射,那么您需要按日期对所有用户/状态进行分组。如果您只想按用户进行映射,那么您需要按用户对所有日期/状态进行分组。如果您要同时查询,您应该只创建两个集合以最小化处理。无论哪种情况,都绝对使用数组来表示饥饿状态。

日期分组的示例结构:

{ date: '1494288000',
time-of-day: [
{ am: [
{ user: asdfas, hunger-state: [hungry, full] },
{ user: juhags, hunger-state: [full] }
],
pm: [
{ user: asdfas, hunger-state: [hungry, full] },
{ user: juhags, hunger-state: [full] }
]}]}

【讨论】:

  • 非常感谢你。关于处理能力如何比数据更昂贵的好建议,我一定会记住的。
  • 您不想以这种非规范化的方式嵌套数据。除了非常狭窄的用例之外,不可能在任何情况下查询它。例如,如果我想了解特定用户当前的饥饿状态是什么,我必须获取所有用户的状态。
  • 这就是我提到两个系列的原因。示例结构非常适合按日期快速查询,这似乎是他的用途。
【解决方案2】:

这取决于您将如何访问它。如果你想报告用户的最后一个已知状态,那么数组可能会更好:

{ 
   user_id: '5358e4249611f4a65e3068ab',
   timestamp: '2017-05-08T17:30:00.000Z',
   hunger: ['HUNGRY','FAMISHED'],
}

如果您传入来自new Date() 的输出,多条记录的时间戳可能无法完美对齐(注意第二条记录是在 99 毫秒之后):

{ 
   user_id: '5358e4249611f4a65e3068ab',
   timestamp: '2017-05-08T17:30:00.000Z',
   hunger: 'HUNGRY',
}

{ 
   user_id: '5358e4249611f4a65e3068ab',
   timestamp: '2017-05-08T17:30:00.099Z',
   hunger: ['FAMISHED',
}

您可能应该查看您的数据模型并尝试获得更具确定性的状态模型。也许:

{ 
   user_id: '5358e4249611f4a65e3068ab',
   timestamp: '2017-05-08T17:30:00.000Z',
   isHungry: true,
   hunger: 'FAMISHED',
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2015-02-01
    • 2012-07-25
    相关资源
    最近更新 更多