如何将 Cloudant (CouchDB) 视为文档堆栈?

How to treat Cloudant (CouchDB) as a document stack?

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

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

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

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

我是不是漏掉了一些选项?

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

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

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

这将创建一个视图,您会看到它列在 "Design Documents" 下。您可以按如下方式在仪表板中查询该视图:

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

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

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

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

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

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

另一种方法是使用书签(正如 OP 在下面评论中所建议的那样)。要做到这一点,请先在 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

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

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

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

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

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

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