MongoDB的:如何索引未知领域(MongoDB: How to index unknown fi

2019-10-28 19:58发布

我们存储与不确定的结构文档。 我的意思是,它的基本结构( idusercreationTimestamp ),但也有一个Map<String, Object> values领域,我们能够存储任何一个结构:

public class Metadata {
    private String id;
    private String user;
    private Date creationTimestamp;
    private Map<String, Object> values;
}

例:

> db.metadata.find();
{
    "_id" : "Doc2Ref2Mdt1",
    "user" : "user1",
    "creationTimestamp" : ISODate("2018-09-24T12:20:56.958Z"),
    "values" : {
        "ambit" : "ctti",
        "departament" : "economia"
    }
},
{
    "_id" : "Doc1Ref2Mdt1",
    "user" : "user2",
    "creationTimestamp" : ISODate("2018-09-24T12:20:56.169Z"),
    "values" : {
        "date" : ISODate("2018-09-24T12:20:56.171Z"),
        "number" : 16,
        "address" : {
        "street" : "Av. Diagonal",
        "location" : "barcelona",
        "credentials" : [
        {
            "password" : "pwd",
            "login" : "main"
        },
        {
            "password" : "pwd",
            "login" : "other",
            "creation" : ISODate("2018-09-24T12:20:56.171Z")
        }],
        "contact" : "contact name",
        "tags" : ["tag1", "tag2"}]
    }
}

所以,你可以看到values可以存储任何结构。

我需要知道,如果MongoDB是能够全部自动索引。

我的意思是,当一个新的领域是“添加”到values ,例如, values.newfield它会自动建立索引。

有任何想法吗?

Answer 1:

您可以在子文档创建一个索引,以及新的字段将被自动添加,

要使用此指标与您的疑问,您必须提供的参数完整,有序的文档。

例如,您的示例:

db.metadata.createIndex({"values",1});

db.metadata.find( “values.ambit”: “ctti”)

==>不会使用索引,但将返回第一个文档。

db.metadata.find(值:{范围: “ctti”})

==>将使用索引,但不返回文档。

db.metadata.find(值:{ “departament”: “ec​​onomia”,范围: “ctti”})

==>将使用索引,但不返回文件,由于不同领域的秩序。

db.metadata.find(值:{范围: “ctti”, “departament”: “ec​​onomia”})

==>将使用索引,并返回返回第一个文档。



Answer 2:

在你想要的方式是不可能的。

您可以尝试在各个领域的文本索引 ,然后实际的查询。 单独的文本搜索可能会导致假阳性匹配,但与正常查询聚集会降低数据集进行扫描,并在大多数情况下会加速这一过程。

有一些限制要牢记:

  • 只有字符串字段将被索引,如.find({ $text: { $search: "2018-09-24" } })不会返回任何东西。 无论是将.find({ $text: { $search: "16" } })
  • 只有完整的单词查询,即没有正则表达式。 您将需要使用language: "none" ,以保持停用词,不使用steming。 像查询.find({ $text: { $search: "barcel" } })将无法找到第二个文档。

第一个限制可以通过周围的系列化待加工values映射到字符串字段上写的,如果你控制所有的写操作。 然后,你将需要创建仅此领域的文本索引。



文章来源: MongoDB: How to index unknown fields