SELECT ... WHERE ... 在 CouchDB 中查询 + Python

SELECT ... WHERE ... query in CouchDB + Python

我是 CouchDb 的新手。我装的时候还以为是MongoDb,现在看来mongo比couch还要通透。至少,在 mongo 中,我几乎可以立即插入和获取数据,使用 find(),在沙发上我没有看到如此简单的查询方式。所以,想象一下,我保存了一个文档

{'type':'post','theme':'blabla'}

现在我需要查询所有帖子。我将如何在 Python 中执行此操作(使用 couchdb 模块)?

首先,尝试创建一个视图。

function(doc) {
  if(doc.type) {
    emit(doc.type);
  }
}

有关视图的更多信息,请参阅此处:http://guide.couchdb.org/draft/views.html

接下来,写一些python。我只有 cloudant-python 库的经验,它看起来像这样:

import cloudant

account = cloudant.Account('http://localhost:5984')
db = account.database('yourdb')

view = db.view('theview')
options = {
    'key': 'post',
    'include_docs': True
}
for row in view.iter(params=options):
    # emits only rows with the key 'post'
    # with each row's emitting document

注意:这也适用于 CouchDB

您可以使用的最简单的方法是 Mango 查询:

首先,让我们创建数据库并保存您的文档(使用 savecreate 已弃用):

import couchdb
s = couchdb.Server()  # this is http://localhost:5984/ by default
db = s.create('posts')
db.save({'type': 'post', 'theme': 'blabla'})

我们应该描述设置 OP。

查询 find

for doc in db.find({'selector': {'type': 'post'}}):
    # process your doc
    print(doc)

就是这样! 在此处阅读有关可能性的更多信息:http://localhost:5984/_utils/docs/api/database/find.html

请注意,JSON 查询作为正常 Python dict 传递。 selector 可以有多个条件,不仅是相等的:

db.find({'selector': {'type': 'post', 'theme': {'$regex': '^bla'}})

别忘了索引

如果您直接使用 API,您会在结果中收到警告。 查询没有使用索引!对于较大的数据库,这会很慢。

以编程方式创建索引是一个挑战,但我学会了如何通过源代码潜水来完成它(你不需要经常这样做 - 这是一个数据库管理任务,你可以使用 Fauxton UI).

访问和查看索引的方法如下:

idx = db.index()

显示:

>>> list(idx)
[{'ddoc': None,
  'name': '_all_docs',
  'type': 'special',
  'def': {'fields': [{'_id': 'asc'}]}}]

现在创建一个新的,在 type:

idx[None, None] = ['type']

(传递None将生成一个随机的设计文档,以及一个随机的索引名称(UUIDs)):

>>> list(idx)
[{'ddoc': None,
  'name': '_all_docs',
  'type': 'special',
  'def': {'fields': [{'_id': 'asc'}]}},
 {'ddoc': '_design/3298cb694b9b0e42b2a70030ece92eca87d3552d',
  'name': '3298cb694b9b0e42b2a70030ece92eca87d3552d',
  'type': 'json',
  'def': {'fields': [{'type': 'asc'}]}}]

如果您要过滤 theme,您也可以添加:

idx['ddoc_theme_idx', 'theme_idx'] = [{'theme': 'asc'}]

给出:

>>> list(idx)
[{'ddoc': None,
  'name': '_all_docs',
  'type': 'special',
  'def': {'fields': [{'_id': 'asc'}]}},
 {'ddoc': '_design/3298cb694b9b0e42b2a70030ece92eca87d3552d',
  'name': '3298cb694b9b0e42b2a70030ece92eca87d3552d',
  'type': 'json',
  'def': {'fields': [{'type': 'asc'}]}},
 {'ddoc': '_design/ddoc_theme_idx',
  'name': 'theme_idx',
  'type': 'json',
  'def': {'fields': [{'theme': 'asc'}]}}]

索引可以在多个字段上 - 只需在列表中添加更多字段,例如:

idx[None, None] = ['type', 'theme']