在ArangoDB 2.5.2中(可能更早),我们编写的代码依赖于允许NULL字符的文档中的值。
在ArangoDB 2.6.1+中,似乎NULL充当字符串终止符,即使可能有更多的字符串数据。我们如何恢复以前的行为?
例如,如果值为"value\u0000SubValue1\u0000SubValue2"
,则不幸的是,较新的版本会截断:
2.5.2 => "value\u0000SubValue1\u0000SubValue2"
2.6.2 => "value"
我们使用NULL作为分隔符,因为我们知道这是一个不会出现在子字符串中的字符。
以下是在Windows上从shell重现问题的步骤。
arangosh [demo]> db._create("SO")
[ArangoCollection 848312398088, "SO" (type document, status loaded)]
arangosh [demo]> db.SO.save({ "v":"a\u0001b"})
{
"_id" : "SO/848317640968",
"_rev" : "848317640968",
"_key" : "848317640968"
}
arangosh [demo]> db.SO.document("SO/848317640968")
{
"v" : "a\u0001b",
"_id" : "SO/848317640968",
"_rev" : "848317640968",
"_key" : "848317640968"
}
arangosh [demo]> db.SO.save({ "v":"a\u0000b"})
{
"_id" : "SO/848320262408",
"_rev" : "848320262408",
"_key" : "848320262408"
}
arangosh [demo]> db.SO.document("SO/848320262408")
{
"v" : "a", // the rest of the value has been truncated
"_id" : "SO/848320262408",
"_rev" : "848320262408",
"_key" : "848320262408"
}
而且,我在GitHub上创建了一个issue。
答案 0 :(得分:1)
这确实是一个错误,但它只发生在特定情况下。
是否触发它取决于文档的检索方式(服务器内的JavaScript函数或通过HTTP API,AQL或CRUD操作)以及文档是否以ShapedJson格式内部保存。
我能够重现2.5& amp; 2.6在Linux下以及以下情况下,当通过HTTP REST API检索文档并使用单个文档读取时,即通过HTTP GET / _api / document //.
以下是如何重现:
创建集合并存储包含NUL属性值的文档:
db._create("SO");
db.SO.save({ "v": "a\u0000b", _key: "b" });
然后从ArangoShell内部查询文档:
db.SO.document("b")
这将返回截断值:
{
"v" : "a",
"_id" : "SO/b",
"_rev" : "4124146417077",
"_key" : "b"
}
在arangod中查询文档或使用ArangoShell中的以下方法之一时,它可以正常工作:
db.<collection>.any()
db.<collection>.toArray()
我在2.6分支中提交了一个修复程序,最终将成为发布版本2.6.3。
请注意,在上述情况下,使用属性值内的NUL字节似乎至少自2014年4月起无效,这意味着它可能无法在2.5中工作,甚至不能在2.4和2.3中工作。