Aerospike,NodeJS。推入对象数组
Aerospike, NodeJS. Pushing into array in object
我需要将一些数据推送到存储在对象中的数组中
例子。
斌,我得到
db.get(key) // -> { a: 'b', b: { c: [] } }
我需要推入 b.c
,但我不能,因为错误
db.operate(key, [Aerospike.lists.append('b.c', 1)]) // -> AerospikeError: no operations defined
能解决还是不能解决?
是的,您必须在我的 Java 示例中使用复杂数据类型 (CDT) 上下文 - CTX class。这需要 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 示例给你。(已编辑)--> Node.js api 地图参考是 here -- 在 API 参考中搜索 CDT 上下文 -- 列表示例由 @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}')
正如@pgupta 正确指出的那样,您需要设置 CDT 上下文以对嵌套的 lists/maps 进行操作。对于 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] } }
我需要将一些数据推送到存储在对象中的数组中 例子。 斌,我得到
db.get(key) // -> { a: 'b', b: { c: [] } }
我需要推入 b.c
,但我不能,因为错误
db.operate(key, [Aerospike.lists.append('b.c', 1)]) // -> AerospikeError: no operations defined
能解决还是不能解决?
是的,您必须在我的 Java 示例中使用复杂数据类型 (CDT) 上下文 - CTX class。这需要 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 示例给你。(已编辑)--> Node.js api 地图参考是 here -- 在 API 参考中搜索 CDT 上下文 -- 列表示例由 @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}')
正如@pgupta 正确指出的那样,您需要设置 CDT 上下文以对嵌套的 lists/maps 进行操作。对于 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] } }