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

时间:2016-04-15 14:42:13

标签: couchdb cloudant

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

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

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

我熟悉观点,但我不确定这有什么帮助。

我错过了一些选择吗?

2 个答案:

答案 0 :(得分:4)

从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所示)。要做,请先在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

答案 1 :(得分:0)

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

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

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

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

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

http://url?start_key=previous_doc&limit=1&skip=1
相关问题