面试题答案
一键面试- 建立数据关系
- 文档结构:
- 文档A:在文档A中添加一个字段,比如
b_doc_ref
,用来存储文档B的_id
。例如:
- 文档A:在文档A中添加一个字段,比如
- 文档结构:
{
"_id": "a_doc_1",
"type": "A",
"b_doc_ref": "b_doc_1",
"other_fields": "..."
}
- **文档B**:按照需求定义文档B的结构和属性。例如:
{
"_id": "b_doc_1",
"type": "B",
"required_property": "some_value",
"other_b_fields": "..."
}
- 验证逻辑
- 使用CouchDB验证函数:在CouchDB设计文档中,可以使用
validate_doc_update
函数来验证数据关系。 - 设计文档示例:
- 使用CouchDB验证函数:在CouchDB设计文档中,可以使用
{
"_id": "_design/validation",
"validate_doc_update": function(newDoc, oldDoc, userCtx) {
if (newDoc.type === "A") {
var bDoc = getDoc({_id: newDoc.b_doc_ref});
if (!bDoc) {
throw({forbidden: "Referenced B document does not exist"});
}
if (bDoc.type!== "B") {
throw({forbidden: "Referenced document is not of type B"});
}
// 验证B文档特定属性
if (!bDoc.required_property) {
throw({forbidden: "B document is missing required_property"});
}
}
if (newDoc.type === "B") {
// 可以在这里添加对B文档自身属性的额外验证
if (!newDoc.required_property) {
throw({forbidden: "B document is missing required_property"});
}
}
}
}
- 解释:
- 当更新或创建文档A时,
validate_doc_update
函数首先通过getDoc
获取被引用的文档B。如果文档B不存在,抛出错误。 - 接着检查文档B的类型是否为“B”,若不是则抛出错误。
- 然后验证文档B是否包含特定属性
required_property
。 - 对于文档B自身,在创建或更新时也验证
required_property
是否存在。
- 当更新或创建文档A时,
- 设计文档部署
- 可以使用CouchDB的API(如
PUT
请求到/your_database/_design/validation
)将上述设计文档部署到指定的CouchDB数据库中,确保验证逻辑生效。
- 可以使用CouchDB的API(如
这样,在无模式的CouchDB中,既建立了文档A引用文档B的关系,又通过设计文档中的验证函数对这种关系及文档B的属性要求进行了验证。