【问题标题】:Arangodb create index of setArangodb 创建集合索引
【发布时间】:2020-07-21 08:53:36
【问题描述】:

是否可以在 Arangodb 中创建集合的索引?

我有以下课程:

public class Entity {
    private String key;
    private Set<String> projectKeys;

    // Getter, Setter, ...
}

假设实体 {key: "1", projectKeys: ["1", "2"]}{key: "2", projectKeys: ["2", "3"]} 存储在数据库中。
现在我想在projectKey 中搜索包含值3 的所有实体。这可以通过以下方式完成:

arangoDb.query(
                "FOR e in @@collection " +
                        "FILTER @projectKey IN e.projectKeys  " +
                        "RETURN e",
                Map.of("@collection", "Entity",
                        "projectKey", projectKey),
                Entity.class)
                .asListRemaining();

我的问题是是否可以在该集合上创建一个索引,如下所示:

// projectKey -> Entity
1 -> entity1
2 -> entity1, entity2
3 -> entity2

如果是,我该怎么做?

【问题讨论】:

    标签: java arangodb arangodb-java


    【解决方案1】:

    是的,这可以通过数组索引来实现。这是documentation的摘录:

    索引数组值 --

    如果索引属性包含一个数组,ArangoDB 默认将整个数组存储为索引值。以这种方式无法通过索引访问数组的各个成员。

    要使索引将单个数组成员插入索引而不是整个数组值,需要为属性创建一个特殊的数组索引。可以使用collection.ensureIndex() 函数将数组索引设置为像常规哈希或跳过列表索引一样。要使散列或跳过列表索引成为数组索引,在创建索引和使用 IN 运算符在 AQL 查询中过滤时,索引属性名称需要扩展为 [*]

    以下示例在名为 posts 的集合中的 tags 属性上创建一个数组哈希索引:

    db.posts.ensureIndex({ type: "hash", fields: [ "tags[*]" ] });
    db.posts.insert({ tags: [ "foobar", "baz", "quux" ] });
    

    然后,此数组索引可用于通过 IN 运算符从 AQL 查询中查找单个 tags 值:

    FOR doc IN posts
     FILTER 'foobar' IN doc.tags
     RETURN doc
    

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多