我需要存储来自不同用户的gps点(timestamp,lon,lat)。
我应该有一个单独的用户集合和一个gps数据集合:
用户
{_id: 1, name: 'A'}
GPS
{_id: 1, userId: 1, timestamp: ..., lon: ..., lat: ...}
{_id: 2, userId: 1, timestamp: ..., lon: ..., lat: ...}
或者我可以将gps数据作为数组保存到相应的用户文档中:
用户
{_id: 1, name: 'A', gps: [
{timestamp: ..., lon: ..., lat: ...}
{timestamp: ..., lon: ..., lat: ...}
]}
我知道选项2对于SQL DB来说会很疯狂,但我不确定MongoDB对性能的影响
答案 0 :(得分:3)
您必须根据应用程序的访问策略设计MongoDB集合。
通常,您应该在以下情况下将点嵌入用户文档:
用户信息时始终检索嵌入数据(点) 检索。如果您总是检索用户信息,但很少需要GPS数据,那么嵌入就不会那么好。
嵌入数据不受修改(或至少很少)
基数不是太大(记住MongoDB文档的最大大小 是16MB)。如果每个用户有100K分,则拆分集合
此外,将点嵌入用户文档中,您可以利用 文档级锁定(如果您使用的是有线Tiger存储引擎)。否则,如果您在并发系统中,使用两个集合设计,您必须在应用程序级别自己处理锁定机制。