Обновить объект в Do-функции в RethinkDB

Пример данных в табличных комнатах:

{
    "id": "8ae9865-b602-41f7-8637-9fd5517095d9",
    "members": {
        "12345": {
            "Id": 12345,
            "Name": "User1",
            "LastUpdated": timestamp
        }
    }
}

Мой запрос:

        result, err := r.DB(rethinkdbDatabase).Table("rooms").Filter(
            r.Row.Field("members").HasFields(playerIdStr)).Nth(0).Default(nil).Do(func(room r.Term) interface{} {
            return r.Branch(
                    room.Ne(nil),
                    room.Update(map[string]interface{}{
                            "LastUpdate": r.Now(),
                    }),
                    r.DB(rethinkdbDatabase).Table("rooms").Insert(map[string]interface{}{
                            "id": r.UUID(),
                            "members": map[string]interface{}{
                                    playerIdStr: map[string]interface{}{
                                            "LastUpdate": r.Now(),
                                            "Name":       request.Player.Name,
                                            "Id":         request.Player.Id,
                                    },
                            },
                    }, r.InsertOpts{
                            Durability: "hard",
                    }),
            )
    }).Run(rethinkdbClient)

Это дает следующую ошибку:

gorethink: Expected type SELECTION but found DATUM:
{
    "id":   "08ae9865-b602-41f7-8637-9fd5517095d9",
    "members":      {
    "7360165":      {
    "Id":   7360165,
    "LastUpdate":   {
    "$reql_type$":  "TIME",
    "epoch_time":   1486826898.51,
    "timezone":     "+00:00"
    },
    "Name": "Player1"
    }
    }
} in:
r.Do(func(var_10 r.Term) r.Term { return r.Branch(var_10.Ne(<nil>), var_10.Update({LastUpdate=r.Now()}), r.DB("drill_dev").Table("rooms").Insert({id=r.UUID(), members={7360165={LastUpdate=r.Now(), Name="Player1", Id=7360165}}}, durability="hard")) }, r.DB("drill_dev").Table("rooms").Filter(func(var_9 r.Term) r.Term { return r.Row.Field("members").HasFields("7360165") }).Nth(0).Default(<nil>))

Насколько я понимаю, проблема заключается в том, что переменная room имеет тип OBJECT, который не совместим с функцией обновления, поэтому вызов room.Update({...}) не работает. Как я могу обновить поле "LastUpdated" во вложенном документе без необходимости повторной фильтрации таблицы, используя переменную помещения?

1 ответ

Потому что документ room имеет идентификатор, вы можете выбрать документ по идентификатору (вместо фильтрации всей таблицы во второй раз) и обновить его таким образом.

Другие вопросы по тегам