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

如何将Cloudant(CouchDB)视为文档堆栈?,couchdb,cloudant,Couchdb,Cloudant,我们将CloudantDB用作文档存储,其中包含要处理的数据列表 在运行时,我们基本上希望获取一个文档,对其进行处理,如果处理成功,则将其从数据库中删除 我看到的唯一机制是获取整个文档列表,这可能对我们不好,因为它可能是一个非常大的列表,或者单个文档是我们有ID,我们不必启动它。如果我处理的是传统的SQL数据库,我可能会有一个游标,只有在我想要处理文档时才会前进 我熟悉各种观点,但我不确定这是否有帮助 我是否缺少一些选项?从Cloudant检索文档有很多选项。视图是允许您查询、排序和聚合文档的底

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

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

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

我熟悉各种观点,但我不确定这是否有帮助


我是否缺少一些选项?

从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/\u find/的HTTP POST调用在仪表板外部运行此功能。有关更多信息,请参阅此链接:

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

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

另一种方法是按照OP在下面评论中的建议使用书签。要执行此操作,请参见首先在Cloudant中创建文本索引:

{
  "index": {},
  "type": "text"
}
运行与上面相同的查询。结果现在将包括一个类似于以下内容的书签字段:

{
  "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"
}
有关书签的更多信息,请参见:


从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/\u find/的HTTP POST调用在仪表板外部运行此功能。有关更多信息,请参阅此链接:

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

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

另一种方法是按照OP在下面评论中的建议使用书签。要执行此操作,请参见首先在Cloudant中创建文本索引:

{
  "index": {},
  "type": "text"
}
运行与上面相同的查询。结果现在将包括一个类似于以下内容的书签字段:

{
  "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"
}
有关书签的更多信息,请参见:


好的,下面是你想怎么做就怎么做。据我所知,你可能有一个观点,你可以获取

如果视图没有太多重复的关键点,这应该不会是一个问题。如果有重复的键,可以在视图发出的键中添加doc.id

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

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

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

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

好的,下面是你想怎么做就怎么做。据我所知,你可能有一个观点 你可以拿来的

如果视图没有太多重复的关键点,这应该不会是一个问题。如果有重复的键,可以在视图发出的键中添加doc.id

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

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

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

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

见下面我的答案。如果有其他限制因素阻止您这样做,请更新您的问题,我将非常乐意看一看。请参阅下面我的答案。如果有其他限制,阻止你这样做,请更新你的问题,我将非常乐意看一看。哦,这可能会奏效。在这个例子中,人们会如何使用书签?我认为这将帮助我基本上一个接一个地遍历所有文档,当我到达末尾时,我可以简单地再次运行查询来处理任何newbookmarks在这个示例中实际上不起作用的内容,因为它们只对文本索引起作用。从理论上讲,如果您从最早的文档开始,您可以简单地删除每个文档,然后重新发出相同的查询,并且始终按顺序进行。如果不想删除文档,可以在循环浏览文档时添加skip参数。我将试着用一个带有书签的文本索引来制作一个例子。哦,那可能行得通。在这个例子中,人们会如何使用书签?我认为这将帮助我基本上一个接一个地遍历所有文档,当我到达末尾时,我可以简单地再次运行查询来处理任何newbookmarks在这个示例中实际上不起作用的内容,因为它们只对文本索引起作用。从理论上讲,如果您从最早的文档开始,您可以简单地删除每个文档,然后重新发出相同的查询,并且始终按顺序进行。如果不想删除文档,可以在循环浏览文档时添加skip参数。我将尝试使用带有书签的文本索引来创建一个示例。