gpt4 book ai didi

couchdb - 基于对象属性值在 Cloudant (CouchDB) 中创建 View

转载 作者:行者123 更新时间:2023-12-04 16:19:27 25 4
gpt4 key购买 nike

我一直试图为这个要求找到解决方案,但我遇到了很多死胡同。

我正在使用 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”

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

    例如
    https://[用户名].cloudant.com/dbname/_design/views/_search/doc?q=determination
  • 上面的搜索将返回所有用户文档中“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"
    }
    ]
    }]
    }
  • 如果使用“搜索”无法做到这一点,那么是否可以使用二级索引来实现这一目标?
  • 最佳答案

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

    您需要在数据库的设计文档中创建自定义 View 以实现此目的:

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

    所以上面的 View 获取数据库中的每个文档,检查它是否有一个包含内容的 items 数组,然后循环遍历所有文档的项目。对于它发现的每个 item 元素,它发出 cat进入结果集作为索引,这很重要,因为我们可以根据这个索引进行排序。我们可以随意构建结果对象( emit 的第二个参数),在上述情况下,我正在构建一个带有用户 ID、项目日期和文本的对象。

    您可以像这样调用 View 以获取所有结果:
    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"

    关于couchdb - 基于对象属性值在 Cloudant (CouchDB) 中创建 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16313815/

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