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] } }