我在一个名为 test 的集合中有以下文档:
[
{
"_key": "2469",
"_id": "test/2469",
"_rev": "_Ujegqfu---",
"fieldName": "some value"
}
]
我使用以下两种方法检索它:
public Result helloWorldJson() {
ArangoDB db = new ArangoDB.Builder().user("<user>").password("<pass>").build();
VPackParser parser = new VPackParser() ;
VPackSlice slice = db.db("<db>").collection("test").getDocument("2469", VPackSlice.class);
String json = db.db("cms").collection("test").getDocument("2469", String.class);
return Results.text().render("{velocy: " + parser.toJson(slice, true) + ", json: " + json);
}
产生此输出:
{velocy: {"_key":"2469","_id":null,"_rev":"_Ujegqfu---","fieldName":"some value"}, json: {"_key":"2469","_id":"test/2469","_rev":"_Ujegqfu---","fieldName":"some value"}
VPackParser 是故意将_id
留为空还是我错过了什么?
存储文档中的_id
字段来自Json不支持的特殊velocypack类型,并且包含存储文档的集合ID。 要在人类可读的"集合名称/文档键"中正确反序列化此字段,反序列化过程需要知道给定集合 ID 的集合名称。仅当进程可以调用数据库或 java 驱动程序的内部集合缓存时,这才有可能。只有当你调用getDocument(String,Type)或其他API方法时,反序列化过程才能访问它。VPackParser
是一个独立的 Velocypack<->Json 解析器,无法解析字段_id
。
String json = db.db("cms").collection("test").getDocument("2469", String.class);
与调用中一样,当您将type
设置为String
VPackParser
实例上的方法toJson()
时,将使用该方法,该方法可以访问 dabase 和集合缓存,因此可以在将 velocypack 解析为 json 时正确解_id
字段。
如果你想将 Velocypack 与 api 调用分开反序列化(正确解析_id
),您可以使用从ArangoDB
、ArangoDatabase
或ArangoCollection
上的方法util()
获得的类ArangoUtil
。
VPackSlice slice = db.db("<db>").collection("test").getDocument("2469", VPackSlice.class);
String json = db.util().deserialize(slice, String.class);