我们使用CloudantDB作为文档存储,包含我们要处理的数据列表。
在运行时,我们基本上想要获取一个文档,处理它,如果处理成功,则将其从数据库中删除。
我看到的唯一机制是获取整个文档列表(这可能对我们不利,因为它可能是一个非常大的列表),或者单个文档是我们有ID(我们赢了&# 39; t必须开始)。如果我正在处理一个传统的SQL数据库,我可能会有一个光标,只有当我想要处理文档时才会前进。
我熟悉观点,但我不确定这有什么帮助。
我错过了一些选择吗?
答案 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