【发布时间】:2016-04-17 13:15:03
【问题描述】:
我和我的一个队友就在沙发库中创建视图以检索数据进行了一次对话。
所以我的建议是为特定的数据检索创建视图,这样会更快更直接。例如,我们有两个不同的管理员:
- 特定组的管理员
- 超级管理员
管理员从他们的特定组中检索数据,超级管理员从所有组中获取数据。
只限制组的管理员获取属于他们的那些数据而不是获取所有数据然后在后端处理它们并比较哪些属于一个组是有意义的。
例如: 创建接受组 ID 并查询其所有数据的 couchbase 视图
另一方面,她只在有计算等复杂的东西时才创建视图,并且创建更多视图可能难以维护。
因为目前我们只使用一个视图来获取所有数据,一旦我们拥有它们,我们就会通过使用 LINQ 在后端获取特定组的特定数据来处理它们。
文档结构:
{
"fooReference": "",
"groupId": 8,
"fooName": "projectTest",
"externalId": "PR572",
"fooDescription": "OG QGpCst vXAuu",
"property5": {
"property1": "124",
"code": "US",
"value": 267206,
"start": "2014-10-01T00:00:00Z",
"end": "2017-09-30T00:00:00Z"
},
"property6": [
"string1",
"string2",
"string14"
],
"property7": [
],
"property8": [
],
"dateAdded": "2016-02-11T07:22:15.2483042Z",
"ownerId": 72,
"dateUpdated": "2016-02-11T07:22:15.2483042Z",
"property9": [
{
"id": 72,
"type": 0
}
],
"property10": false,
"id": "345",
"deleted": false,
"type": "Foo",
"subtype": "Foo"
}
获取所有查询:
function (doc, meta) {
if (doc.type == "Foo" && !doc.deleted) {
emit(meta.id, null);
}
}
这是我要建议的示例查询:
如果我希望它通过 groupId 获取,只需在 emit 中传递 groupId
function(doc, meta) {
if (doc.type == "Foo" && !doc.deleted) {
emit(doc.groupId, doc);
}
}
如果我想获得externalId,我只需将externalId 传递给emit
function(doc, meta) {
if (doc.type == "Foo" && !doc.deleted) {
emit(doc.externalId, doc);
}
}
通过这种方式,我们有不同的查询,具有不同的获取文档的角色,我们不必只通过其id 获取所有文档并在后端使用 LINQ 处理它们。
在后端处理它们的示例:
获取 groupId:
var foos = _fooRepository.GetAll();
foos = foos.Where(s => s.GroupId == group.Id).ToList();
获取 externalId:
var foos = _fooRepository.GetAll();
foos = foos.Where(s => s.externalId == foo.externalId).ToList();
注意:不知何故,性能对我们来说有些重要,特别是在渲染为用户检索数据的页面时。
所以我的问题是这种情况的最佳方法是什么?
【问题讨论】:
-
要给出答案,我们需要知道您的文档结构和您想询问的问题。通常,视图既定义了可以有效检索某些文档的索引,又定义了经典的数据库视图,即文档的选择和投影。如果您的查询仅因开始和结束键值不同(例如,仅一组人员或所有组的人员),您可以使用一个视图。如果查询在结构上有所不同(例如小组的员工或学历的员工),您将需要更多。
-
@TAM 我更新了我的问题。无法提供太多的文档结构,但这就是它的样子。