Aerospike,NodeJS。在对象中推入数组

问题描述 投票:0回答:1

我需要在数组中推送一些数据,这些数据存储在objectExample.Bin中。

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

我需要推入 b.c但我做不到,因为有错误

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

能否解决还是我做不到?

javascript node.js aerospike
1个回答
4
投票

正如 @pgupta 正确指出的,你需要设置 CDT 上下文来操作嵌套的 listmaps。在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] } }

3
投票

是的,你必须在我的Java例子中使用复杂数据类型(CDT)上下文-CTX类。这需要Aerospike服务器4.6.0.2或更高版本。

例如,我有一条记录,其中有一个bin的数据是这样的。

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参考是 此处 -- 在API参考中搜索CDTContext -- 列表的例子由@jan-hecking在下面第2个答案中补充)。) 我想把 "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}')
© www.soinside.com 2019 - 2024. All rights reserved.