根据对象属性值在 Cloudant (CouchDB) 中创建视图

2023-12-12

我一直在尝试找到满足此要求的解决方案,但遇到了很多死胡同。

我在用着Cloudant作为我的用户文档的数据存储。每个用户文档都有一个名为“items”的字段(属性),它是一个对象数组。

所以用户文档看起来像这样:

{
    "_id":"userid1",
    "_rev":"XX",
    "username": "foobaruser"
    "items":
    [
      {
          "date":1357879144069,
          "text":"don't cry because it's over, smile because it happened.",
          "cat":"determination"
      },
      {
          "date":1357879179209,
          "text":"those who mind don't matter, and those who matter don't mind.",
          "cat":"fitness"
      },
      {
          "date":1357883809736,
          "text":"be the change that you wish to see in the world.",
          "cat":"determination"
      },
      {
          "date":1357879179209,
          "text":"those who mind don't matter, and those who matter don't mind.",
          "cat":"hardwork"
      },
      {
          "date":1357879179209,
          "text":"those who mind don't matter, and those who matter don't mind.",
          "cat":"determination"
      }
   ]
}
  • 数据存储中有多个这样的用户文档,每个文档都有属性“items”

要求:

  1. 理想情况下,我想在视图上使用搜索功能并传入“cat”值,然后返回所有文档中与“cat”值匹配的所有“项目”。

    例如 https://[用户名].cloudant.com/dbname/_design/views/_search/doc?q=测定

  2. 上面的搜索将返回所有用户文档中“items”中的所有对象,这些对象具有“cat=decision”,格式类似于以下内容:

    {
        "total_rows": 2,
        "rows": 
        [{
            "id": "userid1",
            "items": 
            [
                {
                    "date":1357879144069,
                    "text":"don't cry because it's over, smile because it happened.",
                    "cat":"determination"
                },
                {
                    "date":1357883809736,
                    "text":"be the change that you wish to see in the world.",
                    "cat":"determination"
                },
                {
                   "date":1357879179209,
                   "text":"those who mind don't matter, and those who matter don't mind.",
                   "cat":"determination"
                }
            ]
        },
        {
            "id": "userid2",
            "items": 
            [
                {
                    "date":135787966655,
                    "text":"Some text",
                    "cat":"determination"
                }
            ]
        }]
    }
    
  3. 如果使用“搜索”不可能做到这一点,那么是否可以使用二级索引来实现这一点?


在 CouchDB 中,您无法将查询参数的动态值传递给视图(在您的情况下为 cat=definition)。 CouchDB 中的方法是创建一个更通用的视图,然后在调用该视图来获取所需数据时调整结果的排序方式。

您需要在数据库的设计文档中创建自定义视图才能实现此目的:

byUserItemCat: {
    map: function (doc) {
        if ( !doc.items || doc.items.length === 0 ) return;
        for ( var i=0; i<doc.items.length; i++ ) {
            emit(doc.items[i].cat,{doc._id,doc.items[i].date,doc.items[i].text});
        }
    }
}

因此,上面的视图获取数据库中的每个文档,检查它是否有一个包含内容的项目数组,然后循环遍历该文档的所有项目。对于它发现的每个项目元素,它会发出cat作为索引进入结果集,这很重要,因为我们可以根据该索引进行排序。我们可以以任何我们喜欢的方式自由构建结果对象(第二个参数emit),在上面的例子中,我使用用户 ID 以及项目的日期和文本构建一个对象。

您可以像这样调用视图,以获得所有结果:

curl -X GET http://127.0.0.1:5984/<db-name>/_design/<design-doc-name>/_view/byUserItemCat

如果您只对索引键(即cat)是你会做的“决心”:

curl -X GET http://127.0.0.1:5984/<db-name>/_design/<design-doc-name>/_view/byUserItemCat?key="determination"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据对象属性值在 Cloudant (CouchDB) 中创建视图 的相关文章

  • couchdb 的高级权限

    我们有一个包含多个用户和复杂的权限系统的 couchapp 应用程序 我们的模型有两种 Foo 和 bar 用户对自己的 Foo 和 Bar 拥有管理员访问权限 并且可以被授予查看 更改和删除其他人的 Foo 和 Bar 的权限 Examp
  • Zend 框架和 Couch DB

    Zend Framework 是否具有本机 Couch DB 支持 我只找到了 Matthew Weier O Phinney 的 Zend Couch http framework zend com wiki display ZFPROP
  • 如何获得按“值”值降序排序的映射/归约结果?如果也使用列表函数可以实现这一点?

    我有视图地图并像这样减少 地图 function doc if doc type var usersLength doc users length for var i 0 i lt usersLength i emit doc users
  • 哪一个 NoSQL 数据库(如果有)可以为查询结果集提供*更改*流?

    哪个 NoSQL 数据库 如果有的话 可以提供changes到查询结果集 有人能给我举一些例子吗 首先 我相信没有一个 SQL 数据库提供此功能 我是对的吗 我需要能够指定任意 简单的查询 其在 SQL 中的等价形式可以写成 SELECT
  • 为每个 CouchDB 用户提供一个单独的数据库是一个好的做法吗?

    我对用户及其文档的结构有一些概念性问题 为 CouchDB 中的每个用户提供自己的保存文档的数据库是一个好习惯吗 我读到 couchDB 可以处理数千个数据库 并且每个用户拥有自己的数据库并不罕见 Reason 提出这个问题的原因是我正在尝
  • update_sequence 更改了 cloudant 数据库中的语义?

    我使用 cloudant couchdb 我注意到数据库上的 changes 查询返回的 update sequence 不是数字 例如 437985 g1AAAADveJzLYWBgYM 更重要的是 响应不稳定 如果查询数据库 3 次 我
  • 适用于 Android 设备(和 iOS)的 CouchDB 安全性

    我刚刚完成了一篇 wiki 文章和博客文章CouchDB 的安全性 http wiki apache org couchdb Security Features Overview 现在我想知道这在 Android 中是如何完成的 Andro
  • CouchDB 附件的自定义属性

    我试图在单个 CouchDB 文档中存储多个独立附件 并为每个附件分配任意属性 即描述 有这样做的约定吗 据我所知 我无法将它们插入 attachments直接构造 提前致谢 您无法修改其中的任何内容 attachments直接使用 因为它
  • 包含修订历史记录的 CouchDB 视图

    我对 CouchDB 很陌生 已经缺少 SQL 了 无论如何 我需要创建一个视图来发出文档的一些属性以及所有修订 ID 像这样的东西 function doc if doc type template emit doc owner id d
  • 使用 Node.js 从 couchdb 检索所有文档

    我正在编写一个简单的测试应用程序来试验 node js 和 couchdb 的功能 到目前为止我很喜欢它 但我遇到了障碍 我已经广泛寻找 但似乎找不到答案 我的测试服务器 一个简单的地址簿 做了两件事 如果用户去localhost 8000
  • 在loudant搜索索引中添加功能

    我在 cloudant 中有一个 Json 文档 id 3 f812228f45b5f4e4962505561953ew245 rev 3 f812228f45b5f4e496250556195372b2 wiki page http en
  • CouchDb 视图 - 列表中的键

    我想查询 CouchDB 并且我有一个特定的需求 我的查询应该返回与此条件相对应的文档的名称字段 id 等于或包含在文档归档 列表 中 例如 字段输出如下 output doc s100 doc s101 doc s102 doc s103
  • CouchDB 对 _users 数据库的读/写限制

    我想限制用户权限 以便普通用户只能读 写自己的用户文档 我设法设置写入权限 以便用户只能编辑自己的文档 通过设计文档中的 validate doc update 函数 现在我只需限制用户查看用户列表或其他用户文档即可 如果我将数据库读取权限
  • CouchDB“加入”两个文档

    我有两个看起来有点像这样的文档 Doc id AAA creator id data DataKey id credits left 500 times used 0 data id AAA 我想要做的是创建一个视图 它允许我传递 Data
  • 如何在Cloudant或CouchDB中使用skip参数?

    在 Cloudant 或 CouchDB 的索引中使用 Skip 参数是否存在潜在的性能损失 有更好的技术可以使用吗 The 在 CouchDB 中写入和查询 MapReduce 视图 http my safaribooksonline c
  • 库存管理系统的 SQL 与 NoSQL

    我正在开发一个基于 JAVA 的网络应用程序 主要目的是拥有在多个称为渠道的网站上销售的产品的库存 我们将担任所有这些渠道的管理者 我们需要的是 用于管理每个渠道的库存更新的队列 库存表 其中包含每个通道上分配的正确快照 将会话 ID 和其
  • PouchDB 身份验证:创建新的 CouchDB 用户

    我使用 PouchDB 身份验证插件 我喜欢它 然而 我对注册过程有点困惑 也许我没有以正确的方式使用它 我用它在我的 CouchDB 数据库中创建新用户 但我不明白为什么它与特定数据库关联 由于我在 CouchDB 用户的特定数据库之前创
  • 是否有 NoSQL 解决方案的比较(在某些情况下哪个更好?)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 当我在 Linux PHP 架构中构建基于密钥的归档应用程序时 我正在尝试了解有关 NoSQL 的更多信息 谁能解释一下主要解决方案
  • 如何使用 ibrowse 将附件上传到 CouchDB 中的文档?

    我已经使用curl上传图像文件Penguins jpg 例如 C curl gt curl vX PUT H Content Type image jpeg http localhost 5984 DBNAME DOCID Penguins
  • 如何从 CouchDB 加载随机文档(高效且公平)?

    我想从存储在 CouchDB 数据库中的一组文档中加载随机文档 单据的取放方式应符合下列要求 效率 文档的查找应该高效 最重要的是加载文档的时间不能随文档总数线性增长 这意味着skip无法使用查询参数 均匀分布 选择应该是真正随机的 尽可能

随机推荐