gpt4 book ai didi

database - 查找缺少任意字段的 CouchDB 文档

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:46 25 4
gpt4 key购买 nike

我需要一个 CouchDB View ,我可以在其中取回所有没有任意字段的文档。如果您事先知道文档可能 没有哪些字段,这很容易做到。 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 中设置的三个字段;像 view/my_view/?key="baz" 这样的东西不会给你任何东西,即使你有很多文档缺少那个字段。我需要一个 View ——我不需要提前指定可能缺少的字段。有什么想法吗?

最佳答案

这种技术称为泰式按摩。当(且仅当) View 以文档 ID 为键时,使用它可以有效地查找 View 中的文档。

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;
}

要查找没有该字段的文档,

  1. GET/db/_all_docs 并记住所有的 id
  2. GET/db/_design/ex/_view/fields?reduce=false&key="some_field"
  3. 比较来自 _all_docs 的 ID 与来自查询的 ID。

_all_docs 中但不在 View 中的 id 是缺少该字段的 id。

将 ID 保存在内存中听起来很糟糕,但您不必这样做!您可以使用合并排序策略,同时遍历两个查询。您从 has 列表(来自 View )的第一个 id 和 full 列表(来自 _all_docs)的第一个 id 开始。

  1. 如果 full <,它缺少该字段,用下一个 full 元素重做
  2. 如果 full = has,它有字段,用下一个 full 元素重做
  3. 如果 full> has,用下一个 has 元素重做

根据您的语言,这可能会很困难。但这在 Javascript 或其他事件驱动的编程框架中非常容易。

关于database - 查找缺少任意字段的 CouchDB 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6183352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com