【问题标题】:Insert on array value in ArangoDB在 ArangoDB 中插入数组值
【发布时间】:2014-10-03 05:13:15
【问题描述】:

我有一个这样的文件。

{ “节点”:{ "-name": "Dev6", “界面”: [ { “-ip”:“10.20.18.65”, “-掩码”:“255.255.255.192” }, { “-ip”:“10.20.18.129”, “-掩码”:“255.255.255.192” } ] } }

我的 perl 程序正在跟踪。

my $dbs_update_Node_by_key ='FOR u IN Node FILTER u._key == @key  UPDATE u WITH {
    name: @name,
    Interface: @Interface
} IN Node';

...... 
(comments: $inf means [{"-ip","-mask"},{"-ip","-mask"}])

my $bind_args = {
key => $doc->{'_key'},
name => $node_attrs->{'-name'},
Interface => $inf
};

$sth = $itdb->query($dbs_update_Node_by_key)->bind($bind_args)->execute();

它返回“无效的绑定参数值”。我认为 ArangoDB perl 驱动程序不支持它。 如何使用 AQL 或 REST API 来实现它?谢谢!

【问题讨论】:

    标签: arangodb


    【解决方案1】:

    我认为问题在于

    [{"-ip","-mask"},{"-ip","-mask"}]
    

    行不通。当使用大括号和成员名称(例如“-ip”、“-mask”)时,必须有一个与每个成员关联的值。使用这个值应该可以工作:

    [{"-ip": "a.b.c.d", "-mask": "a.b.c.d" }, {"-ip": "a.b.c.d" ,"-mask": "a.b.c.d" }]
    

    还请注意,在上述查询中,您将更新名为“name”的属性,而在示例文档中,属性名称为“-name”(前面带有减号)。要使用开头带有减号的属性名称,需要在 AQL 中用反引号括起来(见下文)。

    此外,示例文档在子属性“Node”中具有属性“-name”和“Interface”,而 UPDATE 命令将更新文档顶层的属性“name”和“Interface”。

    我已经稍微调整了查询​​。以下序列似乎适用于 ArangoShell:

    db._create("Node"); 
    db.Node.save({ 
      "_key": "test", 
      "Node": { 
        "someAttribute": "someValue", 
        "-name": "Dev6",  
        "Interface": [ 
          { 
            "-ip": "10.20.18.65", 
            "-mask": "255.255.255.192" 
          }, 
          { 
            "-ip": "10.20.18.129", 
            "-mask": "255.255.255.192" 
          } 
        ] 
      } 
    }); 
    
    dbs_update_Node_by_key = 'FOR u IN Node FILTER u._key == @key ' +
      'UPDATE u WITH { Node: { `-name`: @name, Interface: @Interface } } IN Node'; 
    
    bind_args = { 
      key: "test", 
      name: "Dev8", 
      Interface: [
        {
          "-ip": "8.8.8.8", 
          "-mask": "255.255.255.192" 
        }, 
        {
          "-ip": "192.168.0.1",
          "-mask": "255.255.255.255" 
        }
      ] 
    }; 
    
    db._query(dbs_update_Node_by_key, bind_args); 
    db.Node.toArray();
    

    这将产生:

    [ 
      { 
        "_id" : "Node/test", 
        "_key" : "test", 
        "_rev" : "18996044030550", 
        "Node" : { 
          "-name" : "Dev8", 
          "someAttribute" : "someValue", 
          "Interface" : [ 
            { 
              "-ip" : "8.8.8.8", 
              "-mask" : "255.255.255.192" 
            }, 
            { 
              "-ip" : "192.168.0.1", 
              "-mask" : "255.255.255.255" 
            } 
          ] 
        } 
      } 
    ]
    

    我不确定这是否是您所需要的,但至少它会更新文档并用新值覆盖“接口”属性。

    【讨论】:

    • 谢谢!我已经按照你的建议解决了。顺便说一句,我认为“-”不适合 AQL。例如:'FOR u IN Node FILTER u.-AdminIP == @AdminIP RETURN u' 不能被 AQL 解析。
    • 是的,以减号开头的属性名称需要用反引号括起来才能在 AQL 中正确解析
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    相关资源
    最近更新 更多