ArangoDB中的文档可以具有嵌套的属性,这为组织数据和查询提供了很大的灵活性。但是,ArangoDB对于嵌套属性的命名有一些约定和索引限制,否则可能会导致查询效率降低或无法正常工作。
一般而言,当嵌套的属性命名中包含点号“.”时,这些点号被视为分隔符,ArangoDB会将该属性视为具有多个嵌套级别的属性。例如,假设有如下文档:
{
"name": "Alice",
"address": {
"city": "New York",
"street": "Broadway",
"zipcode": "10001"
}
}
那么可以使用如下方式在AQL中引用嵌套的属性:
FOR doc IN collection
FILTER doc.address.city == "New York"
RETURN doc
然而,如果将点号“.”用作属性名称中的字面字符,则可以使用方括号或反引号对其进行转义:
{
"name": "Bob",
"attr.with.dot": "value"
}
可以使用方括号:
FOR doc IN collection
FILTER doc["attr.with.dot"] == "value"
RETURN doc
也可以使用反引号:
FOR doc IN collection
FILTER doc.`attr.with.dot` == "value"
RETURN doc
需要注意的是,对于具有嵌套属性的文档,除非使用全文索引,否则只能在嵌套属性的末级上创建索引。例如,对于上面提到的文档,可以创建如下索引:
db.collection.ensureIndex({ "address.zipcode": "hash" })
但是不能创建如下索引:
``