【问题标题】:couchbase startkey_docid and complex keycouchbase startkey_docid 和复杂密钥
【发布时间】:2013-12-03 17:41:01
【问题描述】:

下面带有匹配结果集的调用会返回一个不以文档 ID a4a6cf44-8a82-494a-a2b9-f6a3ec629f17 开头的结果。正如下面的结果集所示,前 3 个键是相同的,但 startkey_docid 无效。

关于这个的几个问题

  • startkey_docid 能否正确使用复杂的密钥? (这显然适用于 couchdb)
  • 如果上面的回答是肯定的,我们认为问题的根源是 dateToArray(doc.created) 的使用吗?
  • 这是一个错误吗?

查看:

function (doc, meta) 
{
  if(meta.type == "json" && doc.type == "POST") 
  {
    emit([doc.category, dateToArray(doc.created), doc.visibility], null);
  }
}

呼叫:

?startkey=["auto",[2013,10,10,23,12,0],"EVERYONE"]&endkey=["auto",[2013,12,11,23,12,0],"EVERYONE"]&startkey_docid=a4a6cf44-8a82-494a-a2b9-f6a3ec629f17

结果:

{
    total_rows: 20,
    rows: [{
        id: "a4a6cf44-8a82",
        key: ["auto", [2013, 11, 8, 1, 17, 46], "EVERYONE"],
        value: null
    }, {
        id: "a4a6cf44-8a82-494a-a2b9",
        key: ["auto", [2013, 11, 8, 1, 17, 46], "EVERYONE"],
        value: null
    }, {
        id: "a4a6cf44-8a82-494a-a2b9-f6a3ec629f17",
        key: ["auto", [2013, 11, 8, 1, 17, 46], "EVERYONE"],
        value: null
    }, {
        id: "41070cfc-a85c-424c-9b87-fce0616c77c1",
        key: ["auto", [
        2013, 11, 11, 20, 28, 21], "EVERYONE"],
        value: null
    }, {
        id: "bb275e3c-54da-4e85-8cc3-21defff4e278",
        key: ["auto", [
        2013, 11, 13, 1, 41, 7], "EVERYONE"],
        value: null
    }]
}

示例数据集。 post_id 是文档 ID。

{
    type: "POST",
    post_id: "a4a6cf44-8a82",
    visibility: "EVERYONE",
    userID: "<user_id>",
    title: "Some title 1",
    category: "auto",
    description: "",
    created: "2013-11-07 17:17:46 -0800",
    modified: "2013-11-07 17:17:46 -0800"
}, {
    type: "POST",
    post_id: "a4a6cf44-8a82-494a-a2b9",
    visibility: "EVERYONE",
    userID: "<user_id>",
    title: "Some title 2",
    category: "auto",
    description: "",
    created: "2013-11-07 17:17:46 -0800",
    modified: "2013-11-07 17:17:46 -0800"
}, {
    type: "POST",
    post_id: "a4a6cf44-8a82-494a-a2b9-f6a3ec629f17",
    visibility: "EVERYONE",
    userID: "<user_id>",
    title: "Some title 3",
    category: "auto",
    description: "",
    created: "2013-11-07 17:17:46 -0800",
    modified: "2013-11-07 17:17:46 -0800"
}, {
    type: "POST",
    post_id: "41070cfc-a85c-424c-9b87-fce0616c77c1",
    visibility: "EVERYONE",
    userID: "<user_id>",
    title: "Some title 4",
    category: "auto",
    description: "",
    created: "2013-11-11 12:28:21 -0800",
    modified: "2013-11-11 12:28:21 -0800"
}, {
    type: "POST",
    post_id: "bb275e3c-54da-4e85-8cc3-21defff4e278",
    visibility: "EVERYONE",
    userID: "<user_id>",
    title: "Some title 5",
    category: "auto",
    description: "",
    created: "2013-11-12 17:41:07 -0800",
    modified: "2013-11-12 17:41:07 -0800"
}

【问题讨论】:

  • 可能对startkey_docid的格式敏感,不能像startkey那样用json编码。在我的测试中,这两个 URL 给出了不同的结果:node.avsej.net:8092/default/_design/test/_view/…node.avsej.net:8092/default/_design/test/_view/…
  • 有趣。我注意到您没有使用复杂的密钥。如果您使用复杂的密钥,它仍然有效吗?您使用的是哪个版本的 Couchbase?
  • 如果您将一些数据集转储到 json 中,我可以轻松检查。我的意思是把它添加到问题中
  • 对不起 Avsej 你要什么?上述结果集的数据集来自视图?
  • 是的,这样更容易运行相同的查询来重现案例

标签: couchbase


【解决方案1】:

您可以在此处找到有关如何正确使用startkey_docid 的更多信息:http://blog.couchbase.com/startkeydocid-behaviour

【讨论】:

  • 你能进一步解释它是如何应用于这个例子的吗?前 3 个键是相同的
【解决方案2】:

好的,这是一个旧线程,但为了参考起见,我将发布我的发现并尽我所能解释此功能。


示例

给定一个包含 9,000 多个电影文档的数据库,每个文档包含 titleyearratinggenre 等属性,为该数据库定义一个索引名称为 MovieIndex 的视图 MovieIndexView它发出以下复杂(但相当简单)的键,用于按评级过滤电影并按年份排序:

function (doc) {
    emit([doc.rating, doc.year], doc);
}

可以使用类似于 OP 所示方式的技术查询已排序的行:

- Request -
GET /movies_db/_design/MovieIndex/_view/MovieIndexView?
startkey=["R",{}]
&endkey=["R",0]
&descending=true
&limit=6

- Response -
{
    "total_rows": 9411,
    "offset": 1,
    "rows": [
        {
            "id": "2802144",
            "key": [
                "R",
                2014
            ],
            "value": {
                "_id": "2802144",
                "_rev": "1-924e12ba1f1144e3a453bbd8978acc5c",
                "title": "Kingsman: The Secret Service",
                "year": 2014,
                "rating": "R",
                "runtime": "129 min",
                "genre": [
                    "Action",
                    "Adventure",
                    "Comedy"
                ],
                "director": "Matthew Vaughn"
            }
        },
        <...>
        {
            "id": "2278388",
            "key": [
                "R",
                2014
            ],
            "value": {
                "_id": "2278388",
                "_rev": "1-c38b7f5eb43abfd59fb8514277290e46",
                "title": "The Grand Budapest Hotel",
                "year": 2014,
                "rating": "R",
                "runtime": "99 min",
                "genre": [
                    "Adventure",
                    "Comedy",
                    "Drama"
                ],
                "director": "Wes Anderson"
            }
        }
    ]
}

请注意,我们只通过设置 limit 变量提取了第一个 6 文档(我只粘贴了第一个和最后一个相关项)。

分页

下一个行序列的第一次分页可能是直截了当的。只需将下一个请求的startkey 设置为上一组中最后一项的key 值,同时保持endkey 的值不变:

startkey=["R",2014]
&endkey=["R",0]
&descending=true
&limit=6

您认为这种方法有问题吗?这个新的开始键无法指定响应应该从具有相同值的多个电影项目中的哪一个开始,startkey(具有相同评级的电影,同年上映)。虽然该请求在语法上没有任何问题,但您会注意到返回的行不会从我们想要的下一个连续项目开始,而是从数据库中另一个与 key 匹配值的任意项目开始。

这就是startkey_docid 派上用场的地方:

- Request -
GET /movies_db/_design/MovieIndexView/_view/MovieIndex?
startkey=["R",2014]
&endkey=["R",0]
&descending=true
&limit=6
&startkey_docid=2278388

此请求将返回从序列中正确项目开始的行,提供从视图中对行进行分页的最佳方式。

外卖

startkey_docid 必须与相关的startkey 一起使用才能使您的分页工作。

我希望这可以帮助任何可能对这个微妙功能感到困惑的人。


来源

CouchDB 官方文档:http://docs.couchdb.org/en/latest/couchapp/views/collation.html

有趣的线程交换:http://grokbase.com/t/couchdb/user/091defx51x/sort-by-date-and-find-by-key

类似的 SO 主题:https://stackoverflow.com/questions/10142850/need-a-couchdb-trick-to-sort-by-date-and-filter-by-group#=

【讨论】:

    【解决方案3】:

    点击下面的链接可以非常清楚地了解如何使用 couchDb 结果进行分页:

    http://blog.couchbase.com/pagination-couchbase

    【讨论】:

    • 不要将链接发布为答案,而是添加一些文本来解释此答案如何帮助 OP 解决当前问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2019-08-13
    • 2020-04-23
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多