Аэроспайк NodeJS. Толкая в массив в объекте - PullRequest
1 голос
/ 02 мая 2020

Мне нужно положить sh некоторые данные в массиве, которые хранятся в объекте Example. Бен, что я получаю

db.get(key) // -> { a: 'b', b: { c: [] } }

Мне нужно положить sh в b.c, но я не могу, из-за ошибки

db.operate(key, [Aerospike.lists.append('b.c', 1)]) // -> AerospikeError: no operations defined

Может ли она быть решена или я не могу это сделать?

Ответы [ 2 ]

3 голосов
/ 03 мая 2020

Как правильно заметил @pgupta, вам нужно установить контекст CDT для работы с вложенными списками / картами. С клиентом Node.js вы используете функцию ListOperation # withContext для установки контекста:

db.put(key, { a: 'b', b: { c: [] } })
db.operate(key, [
  Aerospike.lists.append('b', 1)
    .withContext((ctx) => ctx.addMapKey('c'))
])
db.get(key) // => { a: 'b', b: { c: [1] } }
2 голосов
/ 03 мая 2020

Да, вы должны использовать контексты сложных типов данных (CDT) - класс CTX в моем примере Java. Для этого требуется сервер Aerospike версии 4.6.0.2 или выше.

Например, у меня есть запись с корзиной, имеющая такие данные:

KEY_ORDERED_MAP('{"l1k1":{"l2k1":{"l3k1":31, "l3k2":32, "l3k3":99}, "l2k2":22, "l2k3":23}, "l1k2":12, "l1k3":13}')

Использование Java, (я не Например, node.js. (EDITED) -> Node.js Ссылка API для карт: здесь - поиск CDTContext в справочнике по API - Пример списка добавлен во втором ответе ниже @jan -hecking). Я хочу заменить "l3k3": 99, int значение на упорядоченный список, без дубликатов в списке, я могу сделать:

//Edit 2nd level nested value l3k3:99 to an empty list type
           //Note: This list type is inserted with default list policies (UNORDERED)

            List<Value> l1 = new ArrayList<Value>();

            client.operate(wPolicy, key1,
                           MapOperation.put(
                           mPolicy, "myMap", Value.get("l3k3"), Value.get(l1),
                           CTX.mapKey(Value.get("l1k1")),
                           CTX.mapKey(Value.get("l2k1"))
                           )
                          );

           //Append items directly to nested list at l3k3

            l1.add(Value.get(0));
            l1.add(Value.get(4));
            l1.add(Value.get(1));
            l1.add(Value.get(4));

            ListPolicy lPolicy = new ListPolicy(ListOrder.ORDERED,
                                 ListWriteFlags.ADD_UNIQUE|ListWriteFlags.NO_FAIL|ListWriteFlags.PARTIAL);
            client.operate(wPolicy, key1,
                           //We need to explicitly change the order from UNORDERED to ORDERED
                           ListOperation.setOrder("myMap", ListOrder.ORDERED,
                           CTX.mapKey(Value.get("l1k1")),
                           CTX.mapKey(Value.get("l2k1")),
                           CTX.mapKey(Value.get("l3k3"))
                           ),
                           ListOperation.appendItems(
                           lPolicy, "myMap", l1,
                           CTX.mapKey(Value.get("l1k1")),
                           CTX.mapKey(Value.get("l2k1")),
                           CTX.mapKey(Value.get("l3k3"))
                           )
                          );

Это дает:

KEY_ORDERED_MAP('{"l1k1":{"l2k1":{"l3k1":31, "l3k2":32, "l3k3":[0, 1, 4]}, "l2k2":22, "l2k3":23}, "l1k2":12, "l1k3":13}')
...