如何在CouchDB中更新文档

0 投票
1 回答
1377 浏览
提问于 2025-04-28 02:15

我有一个列表 r,里面包含了12个小列表。每个小列表里都有一些元素,从 i[0]i[5],这些元素在不同的小列表中是一样的。

我想要只插入独特的文档,所以最后在数据库里应该只会有5个文档。如果文档已经存在,那就把 i[6]i[7] 添加到 chr 里。

import couchdb

# $ sudo systemctl start couchdb
# http://localhost:5984/_utils/

server = couchdb.Server()
try:
    db = server.create("test")
except couchdb.http.ResourceConflict:
    db = server["test"]

r = [["Test", "A", "B01", 828288,  1,    7, 'C', 5],
    ["Test", "A", "B01", 828288,  1,    7, 'T', 6],
    ["Test", "A", "B01", 171878,  3,    8, 'C', 5],
    ["Test", "A", "B01", 171878,  3,    8, 'T', 6],
    ["Test", "A", "B01", 871963,  3,    9, 'A', 5],
    ["Test", "A", "B01", 871963,  3,    9, 'G', 6],
    ["Test", "A", "B01", 1932523, 1,   10, 'T', 4],
    ["Test", "A", "B01", 1932523, 1,   10, 'A', 5],
    ["Test", "A", "B01", 1932523, 1,   10, 'X', 6],
    ["Test", "A", "B01", 667214,  1,   14, 'T', 4],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 5],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 6]]

_id = None
for i in r:
    _id = str(i[5])
    doc = {
        'type': i[0],
        'name': i[1],
        'sub_name': i[2],
        'pos': i[3],
        's_type': i[4],
        '_id': _id,
        'chr':[]
    }

    doc['chr'].append({
        "letter":i[6],
        "no":i[7]
    })

    a = db.save(doc)

更新
r 中的前两个小列表包含相同的字段(i[0]i[5])。这两个小列表的最终文档应该是这样的:

{
  "_id": "7",
  "_rev": "1-bc0b4e6f3aa855a486225f4a0dcd76c8",
  "sub_name": "B01",
  "name": "A",
  "pos": 828288,
  "s_type": 1,
  "chr": [
      {
          "letter": "C",
          "no": 5
      },
      {
          "letter": "T",
          "no": 6
      }
  ],
  "type": "Test"
}

怎么才能更新一个文档,并把一个字典追加到列表里呢?

暂无标签

1 个回答

0

这是最有效的解决方案吗?

import couchdb

# $ sudo systemctl start couchdb
# http://localhost:5984/_utils/

server = couchdb.Server()
db = server.create("test")
# except couchdb.http.ResourceConflict:
#db = server["test"]

r = [["Test", "A", "B01", 828288,  1,    7, 'C', 5],
    ["Test", "A", "B01", 828288,  1,    7, 'T', 6],
    ["Test", "A", "B01", 171878,  3,    8, 'C', 5],
    ["Test", "A", "B01", 171878,  3,    8, 'T', 6],
    ["Test", "A", "B01", 871963,  3,    9, 'A', 5],
    ["Test", "A", "B01", 871963,  3,    9, 'G', 6],
    ["Test", "A", "B01", 1932523, 1,   10, 'T', 4],
    ["Test", "A", "B01", 1932523, 1,   10, 'A', 5],
    ["Test", "A", "B01", 1932523, 1,   10, 'X', 6],
    ["Test", "A", "B01", 667214,  1,   14, 'T', 4],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 5],
    ["Test", "A", "B01", 667214,  1,   14, 'G', 6]]

# _id = None
for i in r:
    _id = str(i[5])
    doc = db.get(_id)
    if doc is None:
        doc = {
            'type': i[0],
            'name': i[1],
            'sub_name': i[2],
            'pos': i[3],
            's_type': i[4],
            '_id': _id,
            'chr':[]
        }

        doc['chr'].append({
            "letter":i[6],
            "no":i[7]
        })

    else:
        doc['chr'].append({
            "letter":i[6],
            "no":i[7]
        })

    db.save(doc)

撰写回答