【问题标题】:How to return the results of a bulk insert?如何返回批量插入的结果?
【发布时间】:2020-03-13 21:48:08
【问题描述】:

如何返回新插入的文档数组?我想从 Java 执行批量插入。

INSERT {
  text: @text0,
  createdAt: @createdAt0
} IN messages

LET result0 = { id: NEW._key, text: NEW.text, createdAt: NEW.createdAt }

INSERT {
  text: @text1,
  createdAt: @createdAt1
} IN messages

LET result1 = { id: NEW._key, text: NEW.text, createdAt: NEW.createdAt }

RETURN [result0, result1]

除了定义一个新变量将结果保存在其中之外,还有更好的方法来收集每个插入的结果吗?

【问题讨论】:

  • 您希望通过单个命令插入多少个文档?您是否考虑过在 ArangoDB 中使用 Foxx 微服务来帮助您做到这一点?对于真正的批量插入,返回新插入的文档是不常见的,因为它们通常针对速度和快速加载数据进行了优化。但是,如果您要添加较小的可变长度文档突发,我会考虑设置一个 Foxx 端点来为您完成。这样做的好处是您可以实现更多的数据库模式保护并添加额外的业务逻辑。
  • @DavidThomas 不应超过 10 条消息。我想通过仅使用 AQL 来保持简单,这样我可以轻松地在 Arango 管理界面中测试查询。
  • 我刚才回答了一个问题,在this question 我有一个示例,说明如何通过命令行工具 arangosh 将文档批量保存到集合中。这对你有用吗?请记住,文档的 _key 属性是在 INSERT 时随机生成的,但它会递增,因此您可以在 UI 中查询 _key 大于给定数字的情况,以查看新插入的文档。
  • 将这种技术与 arangosh 结合使用,您甚至可以将命令保存在 js 文件中并运行它们,这是批量加载初始文档、创建、删除数据库、修改索引等任何您需要的超级简单方法。
  • @DavidThomas 我正在从 java 执行 AQL 查询。 java sdk 有一个Collection.insertDocuments 函数,它接受一个文档列表(它可能在你提到的下面使用FOXX)。唯一的问题是它也返回 _id、_key、_rev 字段。没有选项可以重写字段。我想添加将包含 _key 值的 id 字段。我想我可以只处理作为结果返回的返回文档列表并删除我不需要的字段并将id 字段添加到其中。

标签: arangodb arangodb-java


【解决方案1】:

这个查询应该做你想做的事。

FOR d IN [
    {text:@text0, createdAt: @createdAt0}, {text:@text1, createdAt: @createdAt1}
]
INSERT d INTO abc
RETURN {
    id: NEW._id,
    text: d.text,
    createdAt: d.createdAt
}

来自 AQL 的示例响应是:

[
  {
    "id": "abc/21971344",
    "text": "apple",
    "createdAt": 1584107091
  },
  {
    "id": "abc/21971345",
    "text": "banana",
    "createdAt": 1584108473
  }
]

只要最终用户不制作 AQL 就应该没问题,尤其是因为您使用的是参数。

如果您曾经在测试之外使用过该产品,我绝对建议您查看 Foxx,因为它为您提供了一个抽象层,托管在(相对)数据库中,这至少可以阻止消费者执行 AQL 查询根本不是,而是他们只是通过 REST 端点进行通信。

附言。这种查询格式也适用:

FOR d IN @messages
INSERT d INTO abc
RETURN {
    id: NEW._id,
    text: d.text,
    createdAt: d.createdAt
}

@messages 在哪里

"messages": [
    {
        "text": "apple",
        "createdAt": 1584107091
    },
    {
        "text": "banana",
        "createdAt": 1584108473
    }
]

【讨论】:

  • 在您展示的第二个示例中,messages 数组中的值是否已清理?
  • 是的,该参数是一个对象数组,因此无法对它们进行 SQL 注入,因为 AQL 命令将参数纯粹作为一个数组来使用。
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 2022-07-08
  • 2014-08-13
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
相关资源
最近更新 更多