обновление Couchbase do c значением, полученным из ключа - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь обновить Couchbase do c из одной структуры в другую, вот текущая структура

{
    "config": {
        "160x600": {
            "siteId": "123455677"
        },
        "300x250": {
            "siteId": "123455677"
        },
        "300x600": {
            "siteId": "123455677"
        }
    }
}

Желаемая структура

{
    "config": {
        "160x600": {
            "siteId": "123455677",
            "size":[160,600]
        },
        "300x250": {
            "siteId": "123455677",
            "size" : [300,250]
        },
        "300x600": {
            "siteId": "123455677",
            "size": [300,600]
        }
    }
}

В основном я хочу перебираем ключи внутри config, разбиваем каждый ключ на 'x' и присваиваем результирующий массив в качестве значения «size» внутри config [key].

Вот запрос N1QL, который я пробовал (который, очевидно, не сделал) т работает, отсюда и этот вопрос);

update AppBucket a set a.config[`size`].size = split(size, `x`) for size in OBJECT_NAMES(a.config) end
where meta(a).id like 'cnfg::40792';

Заранее спасибо.

1 Ответ

4 голосов
/ 24 февраля 2020

Если вам нужен доступ к полю динамического c, вы должны использовать скобки массива сразу после точки (доступ к карте), т.е. config. [V] и v должны быть строковыми или иметь строковые значения. Он вычисляет выражение в скобках массива, оно должно быть строкой, затем преобразуется в идентификатор, подставляет его и оценивает оставшуюся часть пути. Например: config. ["xyz"] ==> config.xyz, config. [f1] (f1 - "field1") ===> config.field1

Также разделенным ключом должна быть строка, а не идентификатор, т.е. "x"

INSERT INTO default VALUES ("cnfg::40792", { "config": { "160x600": { "siteId": "123455677", "size":[160,600] }, "300x250": { "siteId": "123455677", "size" : [300,250] }, "300x600": { "siteId": "123455677", "size": [300,600] } } });

UPDATE default AS a USE KEYS "cnfg::40792"
SET a.config.[v].size = SPLIT(v, "x") FOR v IN OBJECT_NAMES(a.config) END;

Обновленный массив будет иметь строки, т.е. ["160", "600"]. Если вам нужны цифры, используйте следующую команду. Если строка не может быть преобразована в число, она преобразуется в NULL.

UPDATE default AS a USE KEYS "cnfg::40792"
SET a.config.[v].size = ARRAY TO_NUMBER(v1) FOR v1 IN SPLIT(v, "x") END
           FOR v IN OBJECT_NAMES(a.config) END;
...