Обновите значение объекта списка вложенных документов в RethinkDB - PullRequest
0 голосов
/ 29 октября 2018
{
    "id": 1,
    "subdocuments": [
        {
            "id": "A",
            "name": 1
        },
        {
            "id": "B",
            "name": 2
        },
        {
            "id": "C",
            "name": 3
        }
    ]
}

Как обновить под-документ "A" s "name" до значения 2 в RethinkDB в Javascript или Python?

1 Ответ

0 голосов
/ 29 октября 2018

Если вы можете полагаться на положение элемента «А», вы можете обновить его следующим образом:

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)
     })
   })
...