ohb*_*sme 2 python json couchdb
我有一个数据库,里面有一堆常规文档,看起来像这样(来自 wiki 的示例):
{
"_id":"some_doc_id",
"_rev":"D1C946B7",
"Subject":"I like Plankton",
"Author":"Rusty",
"PostedDate":"2006-08-15T17:30:12-04:00",
"Tags":["plankton", "baseball", "decisions"],
"Body":"I decided today that I don't like baseball. I like plankton."
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Python couchdb-python,我想知道是否可以向每个文档添加一个字段。例如,如果我想要一个“位置”字段或类似的字段。
谢谢!
关于ID
couchdb 中的每个文档都有一个 id,无论您是否设置它。文档存储后,您可以通过doc._id字段访问它。
如果您想设置自己的 id,则必须将 id 值分配给doc._id. 如果你不设置它,那么 couchdb 将分配一个uuid。
如果您想更新文档,那么您需要确保具有相同的 ID 和有效的修订版本。如果假设您正在处理博客文章并且用户添加了位置,那么该文章的 url 可能是一个很好的使用 ID。在这种情况下,您可以立即访问该文档。
那么什么是修订版
在上面的代码片段中,您有该doc._rev元素。这是修订版本的标识符。如果您使用已存在的 ID 保存文档,couchdb 会要求您证明该文档仍然是有效的文档,并且您没有试图覆盖其他人的文档。
那么如何更新文档
如果您有文档的 ID,则可以使用 db.get(id) 函数访问每个文档。然后您可以像这样更新文档:
doc = db.get(id)
doc['Location'] = "On a couch"
db.save(doc)
Run Code Online (Sandbox Code Playgroud)
我有一个存储天气预报数据的示例。我大约每 2 小时更新一次天气预报。一个单独的过程正在寻找我从不同提供商那里获得的数据,以查看当天推文的特征。
这看起来像这样。
doc = db.get(id)
doc_with_loc = GetLocationInformationFromOtherProvider(doc) # takes about 40 seconds.
doc_with_loc["_rev"] = doc["_rev"]
db.save(doc_with_loc) # This will fail if weather update has also updated the file.
Run Code Online (Sandbox Code Playgroud)
如果您有并发进程,那么 _rev 将变得无效,因此您必须进行故障保存,例如。这可以做到:
doc = db.get(id)
doc_with_loc = GetLocationInformationFromAltProvider(doc)
update_outstanding = true
while update_outstanding:
doc = db.get(id) //reretrieve this to get
doc_with_loc["_rev"] = doc["_rev"]
update_outstanding = !db.save(doc_with_loc)
Run Code Online (Sandbox Code Playgroud)
那么如何获取Id呢?
上面建议的一种选择是您主动设置 id,以便可以检索它。IE。如果用户设置附加到 URL 的给定位置,请使用该 URL。但您可能不知道要更新哪个文档,甚至有一个流程可以找到所有没有位置的文档并分配一个位置。
您很可能会为此使用视图。视图有一个映射器和一个缩减器。您将使用第一个,忘记最后一个。带有映射器的视图执行以下操作:
它返回一种简单/转换的查看数据的方式。您可以为每个数据返回多个值或跳过一些值。它为您发出的数据提供一个密钥,如果您使用该_include_docs功能,它将为您提供文档(及其_id旁边rev)。
最简单的视图是默认视图db.view('_all_docs')它将返回所有文档,您可能不想更新所有文档。例如,当您定义视图时,视图也将存储为文档。
下一个简单的方法是让视图仅返回文档类型的项目。我的数据库中往往有一个_type="article。如果您将文档存储在关系数据库中,则可以将此视为标记文档属于某个表。
最后,您可以过滤具有位置的元素,这样您就可以在一个视图中迭代仍然需要位置的所有文档,并在单独的过程中识别它。关于编写视图的最佳文档可以在这里找到。
| 归档时间: |
|
| 查看次数: |
6329 次 |
| 最近记录: |