【问题标题】:Work with nested objects using couchdb-python使用 couchdb-python 处理嵌套对象
【发布时间】:2019-02-08 20:47:03
【问题描述】:

免责声明:Python 和 CouchDB 对我来说都是新的。到目前为止,我的“编程”主要由 Bash 脚本组成。

我正在尝试创建一个小脚本来更新 CouchDB 数据库中的对象。然而,这些对象不是由我的脚本创建的,而是由一个名为 Tap Forms 的应用程序创建的,该应用程序使用 CouchDB 进行同步。基本上我正在尝试自动更新应用程序的内容。这也意味着我无法真正影响 CouchDB 中对象的结构或名称。

数据库中大部分都是这种结构的对象:

{
  "_id": "rec-3b17...",
  "_rev": "21-cdf6...",
  "values": {
    "fld-c3d4...": 4,
    "fld-1def...": 1000000000000,
    "fld-bb44...": 760000000000,
    "fld-a44f...": "admin,name",
    "fld-5fc0...": "SSD",
    "fld-642c...": true,
  },
  "deviceName": "MacBook Air",
  "dateModified": "2019-02-08T14:47:06.051Z",
  "dateCreated": "2019-02-08T11:33:00.018Z",
  "type": "frm-7ff3...",
  "dbID": "db-1435...",
  "form": "frm-7ff3..."
}

我稍微缩短了数字并删除了一些条目以增加可读性。

现在我要更新的实际值在 "values" : {...} 数组(或对象,或列表,我猜我对 JSON 也没有太多经验)内。 正如我知道其中一些值一样,我设法创建了在服务器上查找对象的 _id 的视图。然后我使用文档中描述的 python-couchdb 模块:

for item in db.view('CustomViews/test2', key="GENERIC"):
    doc = db[item.id]

这给了我对象。但是,我想更新值数组中的 一个 值,比如说fld-c3d4...。但是怎么做?使用 doc['values'] = 'new_value' 更新整个数组。我按照doc['values['fld-c3d4']'] = 'new_value' 的思路尝试了其他(看似合乎逻辑的)方法,但无法理解它。我在任何文档中都找不到示例。

【问题讨论】:

    标签: python syntax couchdb couchdb-python


    【解决方案1】:

    下面是一个如何更新fld-c3d4的示例。

    您的文档表示带有嵌套字典的字典。

    如果您想获取值,您将执行以下操作:

    values = doc['values']
    

    现在变量值指向文档中的值。

    从那里,您可以访问子值:

    values['fld-c3d4'] = 'new value'
    

    如果你想直接更新文档中的值,你只需要链接这些操作:

    doc['values']['fld-c3d4'] = 'new value'
    

    【讨论】:

    • 我忘了谢谢你,对不起!但是,是的,它做到了。
    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2017-06-07
    • 1970-01-01
    • 2014-09-17
    • 2013-02-03
    相关资源
    最近更新 更多