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 查询:
首先,让我们创建数据库并保存您的文档(使用 save
,create
已弃用):
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']
我是 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 查询:
首先,让我们创建数据库并保存您的文档(使用 save
,create
已弃用):
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']