似乎Riak Datatype API不允许区分不存在的键和默认值。例如,如果我按如下方式查询不存在的密钥:
val fetchOp = new FetchCounter.Builder(key).build()
val c = client.execute(fetchOp).getDatatype
我会得到一个包含0的计数器。现在,如果我将值为0的计数器放在此键并运行查询,我得到相同的结果。有没有办法区分这两种不同的状态?
注意:使用集合时,我可以检查上下文。如果我获取一个集合并且上下文为空,则意味着该集合在该密钥下不存在。然而,这个技巧对于计数器不起作用,因为它们不维护上下文。
更新: Dmitri的建议如下导致以下解决方案:
val fetchOp = new FetchValue.Builder(location).withOption(FetchValue.Option.HEAD, java.lang.Boolean.TRUE).build()
val res = client.execute(fetchOp) // res.isNotFound should equal(true)
然而,缺点是现在我需要进行额外的查询。
答案 0 :(得分:1)
根据我的理解,这是该特定客户的限制(顺便说一下,这是什么语言?)。随意在Github上打开一个问题。
HTTP API至少可以区分不存在的计数器和值恰好为0的计数器。
例如,这是尝试访问现有密钥(值设置为0)的结果:
$ curl http://localhost:8098/types/counters/buckets/room_occupancy/datatypes/room-215 -v
> GET /types/counters/buckets/room_occupancy/datatypes/room-215 HTTP/1.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Vary: Accept-Encoding
* Server MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho) is not blacklisted
< Server: MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho)
< Date: Thu, 20 Aug 2015 03:38:56 GMT
< Content-Type: application/json
< Content-Length: 28
<
* Connection #0 to host localhost left intact
{"type":"counter","value":0}
这是检索不存在的键的值的结果:
curl http://localhost:8098/types/counters/buckets/room_occupancy/datatypes/non-existent-room -v
> GET /types/counters/buckets/room_occupancy/datatypes/non-existent-room HTTP/1.1
> User-Agent: curl/7.37.1
> Host: localhost:8098
> Accept: */*
>
< HTTP/1.1 404 Object Not Found
< Vary: Accept-Encoding
* Server MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho) is not blacklisted
< Server: MochiWeb/1.1 WebMachine/1.10.8 (that head fake, tho)
< Date: Thu, 20 Aug 2015 03:32:51 GMT
< Content-Type: application/json
< Content-Length: 37
<
{"type":"counter","error":"notfound"}
但是,您可以使用现有客户端进行解决方法。
您可以为该计数器发出常规的Fetch Object操作(最好将'HEAD only'选项设置为true)。 Riak计数器(或任何其他数据类型)仍然作为常规对象存在,您可以向它发出HEAD请求(而不是获取计数器或其他),它将按预期返回404。