2016-04-15 47 views
1

我们使用一个CloudantDB作为文档存储,包含我们想要处理的数据列表。如何将Cloudant(CouchDB)视为文档堆栈?

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

我看到的唯一机制是要么获得整个文档列表(这可能不适合我们,因为它可能是一个非常大的列表),或单个文档是我们有ID(我们赢了不必开始)。如果我正在处理一个传统的SQL数据库,那么我可能会有一个游标,当我想要处理一个文档时,我只会推进它。

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

我错过了一些选择吗?

+0

请参阅下面的答案。如果还有其他限制阻止你这样做,请更新你的问题,我会很乐意看一看。 – markwatsonatx

回答

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"

您可以使用HTTP POST调用/db/_find/在仪表板的外部运行此操作。请参阅此链接了解更多信息:

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

+0

哦,这可能工作。如何使用这个例子的书签?我认为这将帮助我基本上一次一个地通过所有文档,并且当我到达最后时,我可以再次运行查询以处理任何新的 – RedBullet

+0

书签实际上不会与此示例一起工作,因为他们只在文本索引上工作。理论上,如果您从最早的文档开始,您可以简单地删除每个文档并重新发出相同的查询,并且您总是可以按顺序进行。如果您不想删除文档,则可以在循环查看文档时添加skip参数。我将尝试使用带书签的文本索引来构建一个示例。 – markwatsonatx

+0

使用书签在上面添加了一个示例。 – markwatsonatx

0

好吧,这里是你如何能做到你想要的。据我所知,你可能有一个观点,你可以取。

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

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

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

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

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