查找缺少任意字段的 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 和多个数据库

是否有 jquery.couch.js 的文档? [关闭]

如何使用 Jquery 和 CouchDb 创建 SIGN UP 和 LOG IN?

限制用户访问 CouchDB 中的某些文档

如何使用 Python 在 Couchdb 中显示所有文档

CouchDB学习-介绍