获得列位置

时间:2012-06-13 11:34:48

标签: nosql cassandra

在CassandraDB中,使用有序列族。我知道你可以得到切片,但你能得到这个位置。例如,在这个数据模型中,我保存了这样的分数:

"Scores":
{
   "1000": "bob, lucas",
   "900": "tim"
   "800": "mario"
}

是否有可能知道用户得分为“900”并且他的昵称是“蒂姆”,知道他在有序列系列的第2位?

1 个答案:

答案 0 :(得分:2)

Cassandra并不提供开箱即用的功能,但您可以使用三个独立的CF自行实现。请考虑以下情况:

"Scores":
{
   "1000": "bob, lucas"
   "900": "tim"
   "800": "mario"
}

"PlayerScores":
{
   "bob": "1000"
   "lucas": "1000"
   "tim": "900"
   "mario": "800"
}

"ScoreTotals":
{
   "1000": 
   {
      "1000":2
   }
   "900": 
   {
      "900":1
   }
   "800": 
   {
      "800":1
   }
}

每次用户达到该分数时,ScoreTotals CF将与计数器列一起使用以递增/递减该值。如果您的分数具有额外的粒度(例如910与甚至900),您可以将密钥视为具有列名称作为特定分数的桶。 PlayerScores显然存在,因此您可以查询玩家的分数。

然后,您可以通过简单地将所有得分的总和相加得比玩家的总和来确定排名。由于分数存储在列名称中,因此您可以使用标准切片查询来获取范围,而无需使用保留订单的分区程序(具有一些负面影响)。