【问题标题】:How to treat Cloudant (CouchDB) as a document stack?如何将 Cloudant (CouchDB) 视为文档堆栈?
【发布时间】:2016-04-16 02:38:44
【问题描述】:

我们将 CloudantDB 用作文档存储,其中包含我们要处理的数据列表。

在运行时,我们基本上想要获取一个文档,对其进行处理,如果处理成功,则将其从数据库中删除。

我看到的唯一机制是获取整个文档列表(这可能对我们不利,因为它可能是一个非常大的列表),或者单个文档是我们拥有 ID(我们赢了)不必开始)。如果我处理的是传统的 SQL 数据库,我可能会有一个游标,只有在我想处理文档时才会前进。

我对视图很熟悉,但我也不确定这是否有帮助。

我错过了一些选择吗?

【问题讨论】:

  • 在下面查看我的答案。如果还有其他限制阻止您这样做,请更新您的问题,我将非常乐意查看。

标签: couchdb cloudant


【解决方案1】:

有许多选项可用于从 Cloudant 检索文档。视图是允许您查询、排序和聚合文档的基础技术。在您的特定示例中,听起来您只想获取最新(或最少)的文档。您可以使用视图来执行此操作,或者在 Cloudant 中您可以简单地创建一个索引。

假设您有一个名为create_date 的日期字段。在 Cloudant 中,您可以像这样创建索引(转到查询,然后单击“您的可用索引”旁边的编辑):

{
  "index": {
    "fields": [
      "create_date"
    ]
  },
  "type": "json"
}

这将创建一个视图,您将看到它列在“设计文档”下。您可以按如下方式在仪表板中查询该视图:

{
  "selector": {
    "create_date": {
      "$gt": 0
    }
  },
  "fields": [
    "_id",
    "_rev"
  ],
  "sort": [
    {
      "create_date": "desc"
    }
  ],
  "limit": 1
}

注意,我已将查询限制为 1 个文档。这将返回最近添加到 Cloudant 的文档。要检索添加到 Cloudant 的最早文档,请将排序更改为 "create_date": "asc"

您可以使用对 /db/_find/ 的 HTTP POST 调用在仪表板外部运行此操作。有关详细信息,请参阅此链接:

https://docs.cloudant.com/cloudant_query.html#finding-documents-using-an-index

更新:使用文本索引和书签

上述方法假设您要删除每个文档并每次重新运行查询。如果您使用升序排序,您将始终按顺序处理文档,但如果您使用降序排序,则可以在插入新文档时处理它们。

另一种方法是使用书签(正如 OP 在下面的 cmets 中所建议的那样)。首先在 Cloudant 中创建一个文本索引:

{
  "index": {},
  "type": "text"
}

运行与上述相同的查询。结果现在将包含一个类似于以下内容的bookmarks 字段:

{
  "docs":[{
    "_id":"aa279ae2835f51d8ea13ee3e6ae3a210",
    "_rev":"1-e90f3814f49b3e89158f8d2337de89cb"}
  ],
  "bookmark": "g1AAAAD4eJzLYWBgYM5gTmHQSElKzi9KdUhJMtRLytVNSczRLS5JzEtJLEox1EvOyS9NScwr0ctLLckB6mBKUgCSSfb____PAvPdHK_uzd_TwMCQKJ1Fuml5LECSYQGQAhq4H2HiAWEHoIkKaCaaE23iAYiJ9xEmHhY7AHZjFgAnFk_X"
}

在后续的查询中可以传递书签来按顺序遍历文档:

{
  "selector": {
    "create_date": {
      "$gt": 0
    }
  },
  "fields": [
    "_id",
    "_rev"
  ],
  "sort": [
    {
      "create_date": "desc"
    }
  ],
  "limit": 1,
  "bookmark" : "g1AAAAD4eJzLYWBgYM5gTmHQSElKzi9KdUhJMtRLytVNSczRLS5JzEtJLEox1EvOyS9NScwr0ctLLckB6mBKUgCSSfb____PAvPdHK_uzd_TwMCQKJ1Fuml5LECSYQGQAhq4H2HiAWEHoIkKaCaaE23iAYiJ9xEmHhY7AHZjFgAnFk_X"
}

更多关于书签的信息可以在这里找到:

https://docs.cloudant.com/cloudant_query.html#working-with-indexes

【讨论】:

  • 哦,这可能行得通。在该示例中如何使用书签?我认为这基本上可以帮助我一个接一个地遍历所有文档,当我完成时,我可以简单地再次运行查询来处理任何新的
  • 书签实际上不适用于此示例,因为它们仅适用于文本索引。从理论上讲,如果您从最早的文档开始,您可以简单地删除每个文档并重新发出相同的查询,您将始终按顺序进行。如果您不想删除文档,可以在循环浏览文档时添加跳过参数。我将尝试使用带有书签的文本索引组合一个示例。
【解决方案2】:

好的,这就是你可以做你想做的事的方法。据我了解,您可能有一个可以获取的视图。

如果视图没有太多重复的键,那应该不是问题。如果您有重复的键,您可以在视图发出的键中添加 doc.id。

您要做的就是像使用某种光标一样...获取整个列表显然不是一个好主意,但获取 2 个文档应该不会那么糟糕。

首先,获取前 2 个文档。第二个文档需要用作我们下一次提取的指针。

处理您的文档并将其从 couchdb 中删除。使用第二个先前获取的文档的键并获取下一个文档。您可以添加一个 skip=1 以不获取您已经获取的文档。

http://url?start_key=previous_doc&limit=1&skip=1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多