如何将 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
我们使用 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