Да, вы должны использовать контексты сложных типов данных (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}')