2016-12-12 122 views
0

我正在将一个Node/Express应用程序的后端从MongoDB重构到Redis。我的数据目前由几十个(〜70)文档组成,每个文档由NAME,缩写ABBR,GeoJSON位置和整数参数数组组成。每个文档的PARAMETER每隔几分钟更新一次,但其余属性保持不变。 PARAMETER属性的长度可能会有所不同(也可能为空)。我想对数据执行很多查询以检查给定点的最近位置,并显示名称,缩写和参数。Redis中的复杂数据结构

一个例子文件:

{ 
    _id: ObjectId("1"), 
    name: 'A place', 
    abbr: 'PLC', 
    location: { type: "Point", coordinates: [ -130.922, 33.289 ]}, 
    parameters: [3 4 28], 
} 

我熟悉的Redis的GEOADD命令,但我不明白如何使用它来创建更复杂的数据结构给握住我的数据,如果我使用GEOADD命令来指定一个位置,然后尝试使用HMSET为名称和缩写添加字段,我会得到一个WRONGTYPE错误。

我很欣赏的错误,因为我看重引用透明和我喜欢的类型时,都认真对待。但我也认为我可能从根本上误解了Redis如何存储数据。当我最初开始学习Redis的概念后重构,我设想能够存储我的数据的形式类似

1 name 'A Place' abbr 'PLC' location -130.922 33.289 parameters 3 4 28 

或者,如果没有那么,一种能够方便地查询的位置贴近我的组沿与其他属性。

回答

2

Redis核心数据结构不能嵌套。在你的例子中,你应该为每个级别使用不同的密钥(和数据结构),例如,属性的哈希值,位置的Geoset和参数的哈希值。

一旦你有了到位,您的查询应该包括三个读取组成最终的答案。

+0

实用的方法是将存储位置为“-130.922,33.289”哈希值的字符串,而ID添加到与GEOADD集地理,所以它会作为一个指标。 –