Обновить значение объекта списка вложенных документов в RethinkDB

{
    "id": 1,
    "subdocuments": [
        {
            "id": "A",
            "name": 1
        },
        {
            "id": "B",
            "name": 2
        },
        {
            "id": "C",
            "name": 3
        }
    ]
}

Как обновить «имя» вложенного документа «A» до значения 2 в RethinkDB либо в Javascript, либо в Python?


person Ben    schedule 28.10.2018    source источник


Ответы (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})) })})
})

В качестве альтернативы вы можете использовать функцию карты для перебора элементов массива и обновления того, который соответствует вашему условию.

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)
     })
   })
person taygetos    schedule 29.10.2018
comment
Это кажется довольно сложным для выполнения простой операции. Это действительно самый простой способ? - person Ben; 01.11.2018
comment
Вы можете изменить свою модель данных, например: {id:1,subdocuments:{A:{name:1},B:{name:2},C:{name:3}}} тогда вы сможете сделать обновить следующим образом: ...get(1).update({subdocuments:{A:{name:2}}}) - person taygetos; 01.11.2018