向CouchDB中的现有文档添加字段

2024-05-14 03:19:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据库,里面有一堆常规文档,看起来像这样(来自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."
}

我在Python中使用couchdb-python,我想知道是否可以向每个文档添加一个字段。例如,如果我想要一个“位置”字段或类似的字段。在

谢谢!在


Tags: 文档id数据库示例docwikirevsome
1条回答
网友
1楼 · 发布于 2024-05-14 03:19:29

关于ID

couchdb中的每个文档都有一个id,无论您是否设置它。一旦文档被存储,您就可以通过doc._id字段访问它。在

如果要设置自己的id,则必须将id值赋给doc._id。如果不设置它,couchdb将分配一个uuid。在

如果要更新文档,则需要确保具有相同的id和有效的修订。如果假设你正在从一篇博客文章中工作,并且用户添加了位置,那么文章的url可能是一个很好的id。在这种情况下,您可以立即访问文档。在

那么什么是修订版

在上面的代码片段中有doc._rev元素。这是修订的标识符。如果用已经存在的id保存文档,couchdb要求您证明该文档仍然是有效的文档,并且您没有试图覆盖其他人的文档。在

那么如何更新文档

如果您有文档的id,则只需使用数据库获取(id)功能。然后可以按如下方式更新文档:

doc = db.get(id)
doc['Location'] = "On a couch"
db.save(doc)

我有一个存储天气预报数据的例子。我大约每2小时更新一次预报。另一个过程是寻找数据,我从不同的提供商那里获得,查看当天推特的特征。在

看起来像这样。在

^{pr2}$

如果您有并行进程,那么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)

那我怎么拿到身份证?

上面建议的一个选项是主动设置id,这样就可以检索它。例如,如果用户设置了一个附加到URL的给定位置,则使用URL。但是,您可能不知道要更新哪个文档,或者甚至没有一个流程来查找所有没有位置的文档并分配一个位置。在

你很可能会使用一个视图。视图有一个映射器和一个减速器。你用第一个,忘了最后一个。带有映射器的视图执行以下操作:

它返回查看数据的简化/转换方式。可以为每个数据返回多个值,也可以跳过一些值。{{cd6>给你一个

最简单的视图是默认视图db.view('_all_docs')这将返回所有文档,您可能不想更新所有文档。例如,当您定义这些视图时,这些视图也将存储为文档。在

下一个简单的方法是使视图只返回文档类型的项。我的数据库中往往有一个_type="article。如果文档存储在关系数据库中,可以将其视为标记文档属于某个表。在

最后,您可以过滤具有位置的元素,这样您就有了一个视图,您可以在其中迭代所有仍然需要位置的文档,并在单独的流程中标识该位置。有关编写视图的最佳文档可以在here中找到。在

相关问题 更多 >