【问题标题】:Update a subdocument list object value in RethinkDB更新 RethinkDB 中的子文档列表对象值
【发布时间】:2018-10-30 01:50:11
【问题描述】:
{
    "id": 1,
    "subdocuments": [
        {
            "id": "A",
            "name": 1
        },
        {
            "id": "B",
            "name": 2
        },
        {
            "id": "C",
            "name": 3
        }
    ]
}

如何在 RethinkDB 中使用 Javascript 或 Python 将子文档“A”的“名称”更新为 2?

【问题讨论】:

    标签: rethinkdb rethinkdb-javascript rethinkdb-python


    【解决方案1】:

    如果你可以依赖“A”元素的位置,你可以像这样更新:

    r.db("DB").table("TABLE").get(1)
      .update({subdocuments:
        r.row("subdocuments").changeAt(0, r.row("subdocuments").nth(0).merge({"name":2}))})
    

    如果不能靠位置,就得自己找:

    r.db("DB").table("TABLE").get(1).do(function(doc){
      return doc("subdocuments").offsetsOf(function(sub){return sub("id").match("A")}).nth(0)
        .do(function(index){ 
          return r.db("DB").table("TABLE").update({"subdocuments": 
            doc("subdocuments").changeAt(index, doc("subdocuments").nth(index).merge({"name":2})) })})
    })
    

    作为一种替代方法,您可以使用 map 函数迭代数组元素并更新与您的条件匹配的元素

    r.db("DB").table("TABLE").get(1)
       .update({
         subdocuments: r.row("subdocuments").map(function(sub){  
           return r.branch(sub("id").eq("A"), sub.merge({name: 2}), sub)
         })
       })
    

    【讨论】:

    • 做一个简单的操作似乎有点复杂。这真的是最简单的方法吗?
    • 你可以修改你的数据模型,例如:{"id":1,"subdocuments":{"A":{"name":1},"B":{"name": 2},"C":{"name":3}}} 那么你就可以像这样进行更新: ...get(1).update({"subdocuments":{"A":{"名称":2}}})
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多