查找缺少任意字段的 CouchDB 文档
Posted
技术标签:
【中文标题】查找缺少任意字段的 CouchDB 文档【英文标题】:Find CouchDB docs missing an arbitrary field 【发布时间】:2011-05-31 05:27:59 【问题描述】:我需要一个 CouchDB 视图,我可以在其中取回所有没有任意字段的文档。如果您事先知道文档可能没有哪些字段,这很容易做到。 For example,这使您可以发送 view/my_view/?key="foo"
以轻松检索没有“foo”字段的文档:
function (doc)
var fields = [ "foo", "bar", "etc" ];
for (var idx in fields)
if (!doc.hasOwnProperty(fields[idx]))
emit(fields[idx], 1);
但是,您只能询问视图中设置的三个字段;像view/my_view/?key="baz"
这样的东西不会给你任何东西,即使你有很多文档缺少该字段。我需要一个视图——我不需要提前指定可能缺少的字段。有什么想法吗?
【问题讨论】:
【参考方案1】:这种技术被称为泰式按摩。当(且仅当)视图以文档 ID 为键时,使用它在视图中不有效地查找文档。
function(doc)
// _view/fields map, showing all fields of all docs
// In principle you could emit e.g. "foo.bar.baz"
// for nested objects. Obviously I do not.
for (var field in doc)
emit(field, doc._id);
function(keys, vals, is_rerun)
// _view/fields reduce; could also be the string "_count"
return re ? sum(vals) : vals.length;
要查找没有该字段的文档,
GET /db/_all_docs
并记住所有 ID
GET /db/_design/ex/_view/fields?reduce=false&key="some_field"
比较来自 _all_docs
的 ID 与来自查询的 ID。
_all_docs
中但不在视图中的 id 是缺少该字段的那些。
将 id 保存在内存中听起来很糟糕,但您不必这样做!您可以使用合并排序策略,同时迭代两个查询。您从 has 列表的第一个 id(来自视图)和 full 列表的第一个 id(来自 _all_docs)开始。
-
如果full有,则缺少该字段,用下一个full元素重做
如果 full = has,它有字段,用下一个 full 元素重做
如果 full > has,用下一个 has 元素重做
根据您的语言,这可能会很困难。但在 javascript 或其他事件驱动的编程框架中非常容易。
【讨论】:
【参考方案2】:如果事先不知道可能的字段,答案很简单。您必须创建一个新视图才能找到缺失的字段。该视图将逐个扫描每个文档。
为避免干扰现有视图和设计文档,您可以使用全新的设计文档。这样,搜索缺失的字段不会影响您可能已经在使用的现有视图。
【讨论】:
以上是关于查找缺少任意字段的 CouchDB 文档的主要内容,如果未能解决你的问题,请参考以下文章
Couchdb、couch-connector 和多个数据库