Arangodb 在截断的文档值中使用NULL
在Arangodb2.5.2(可能更早)中,我们编写的代码依赖于文档中允许空字符的值 在ArangoDB 2.6.1+中,NULL似乎充当字符串终止符,即使可能有更多的字符串数据。我们如何恢复以前的行为 例如,如果该值为Arangodb 在截断的文档值中使用NULL,arangodb,Arangodb,在Arangodb2.5.2(可能更早)中,我们编写的代码依赖于文档中允许空字符的值 在ArangoDB 2.6.1+中,NULL似乎充当字符串终止符,即使可能有更多的字符串数据。我们如何恢复以前的行为 例如,如果该值为“value\u0000SubValue1\u0000SubValue2”,则较新版本会很遗憾地截断: 2.5.2 => "value\u0000SubValue1\u0000SubValue2" 2.6.2 => "value"
“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上创建了一个bug。这确实是一个bug,但它只在特定情况下发生 是否触发它取决于如何检索文档(服务器内部的JavaScript函数或通过HTTP API、AQL或CRUD操作),以及文档是否以ShapedJson格式内部保存 在Linux下,当通过HTTP REST API检索文档并使用单个文档读取(即通过HTTP GET/_API/document/)时,我能够在以下情况下重现2.5和2.6的问题 以下是如何复制:
- 创建集合并存储包含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.SO.document("b")
db..any()
db..toArray()
请注意,至少从2014年4月起,在上述情况下,在属性值中使用NUL字节似乎不起作用,这意味着它可能在2.5中不起作用,甚至在2.4和2.3中也不起作用。我用arangosh:db.test.any()检查了linux版本。{u id:“test/1714178880”,“_key:“1714178880”,“_rev”:“1714178880”,“a”:“a\u0000b\u0000c”}带操作系统,您使用哪种驱动程序/语言?Windows、.NET。也尝试使用Web API。也许最好在github的.NET端打开一个问题?对我来说,当前的Web界面将其保存为json中的\\0;您可能需要在此处退出\(正如我所提到的,它在2.5版本中确实有效,因为那是我们之前使用的版本)。我也可以在2.5版本中触发该问题,但只有在上述情况下。应该从2.6.3开始解决:@wiredparie:你能确认它已修复吗?Bug tracker问题也仍然存在,我们将很快确认(需要几天时间才能回到那个项目)。