【问题标题】:Can I index the keys of a object-type subdocument in MongoDB?我可以在 MongoDB 中索引对象类型子文档的键吗?
【发布时间】:2021-06-11 03:59:10
【问题描述】:

有没有什么方法可以根据对象类型的子文档的键索引我的集合?并且所有文档中的key并不统一,不同的文档有不同的key,但是有一些共同的key。子文档的键是取自 NLTK 单词语料库的英文单词。文档结构如下:

{
    _id: 24752893,
    dictionary: {
        attain: {
            language: ....,
            count: ....,
        },
        book: {
            language: ....,
            count: ....,
        },
        obtain: {
            language: ....,
            count: ....,
        },
        ....
    }
},
{
    _id: 6786765789,
    dictionary: {
        book: {
            language: ....,
            count: ....,
        },
        carbon: {
            language: ....,
            count: ....,
        },
        garbage: {
            language: ....,
            count: ....,
        },
        ....
    }
},
........
{
    _id: 76675567,
    dictionary: {
        web: {
            language: ....,
            count: ....,
        },
        obtain: {
            language: ....,
            count: ....,
        },
        carbon: {
            language: ....,
            count: ....,
        },
        ....
    }
}

我想根据对象类型字典字段的键,即英文单词进行索引,以加快搜索速度。我使用的是 MongoDB 4.4 版。

【问题讨论】:

    标签: mongodb dictionary indexing aggregation-framework subdocument


    【解决方案1】:
    dictionary: [
        {
        attain: {
            language: ....,
            count: ....,
        },
        book: {
            language: ....,
            count: ....,
        },
        obtain: {
            language: ....,
            count: ....,
        }
    }
    ]
    

    -------------或使用属性模式------------

    dictionary: [
        
        {
            k:'attain',
            language: ....,
            count: ....,
        },
        {
            k:'book',
            language: ....,
            count: ....,
        },
        {
            k:'obtain',
            language: ....,
            count: ....,
        }
    
    ]
    

    使用 $elemMatch 找到正确的子集,您的架构设计是错误的 像这样修改您的架构并使用多键索引。 https://docs.mongodb.com/manual/core/index-multikey/

    db.collection.createIndex( { "dictionary.k": 1, "dictionary.language": 1,"dictionary.count":1 } )

    【讨论】:

    • 是否有必要将子文档中的所有三个字段都显式放入多键索引中?比如{ "dictionary.k": 1, "dictionary.language": 0,"dictionary.count":0 } or { "dictionary.k": 1 },这两种写法有区别吗命令?
    • 有没有办法将我写的架构转换成你建议的架构?还是我必须使用修改后的架构再次插入所有文档?
    • 1) 是的,你可以创建一个索引文件,你想要的 { "dictionary.k": 1 } 是有效的。它取决于查询。 2)转换成已有的schema,需要写js,需要更新。这有点复杂,但可以实现。或者,如果您可以使用新模式重新插入它,那么它是直截了当的。这种模式设计(第 2 种)称为属性模式,专为电子商务产品属性设计。
    【解决方案2】:

    所以不,Mongo 没有可用的“对象键”索引选项,可能的是以下方法之一:

    1. 在每个文档上维护一个数组,其中包含它所拥有的单词,将该字段编入索引,然后将您的查询更改为首先查询该字段。

    2. 使用wildcard indexes,您应该阅读wildcard restriction docs 以确保它能够满足您的查询需求,因为它们具有一些不同于其他索引类型的独特行为。通配符的索引创建语法如下:

    db.collection.createIndex( { "dictionary.$**" : 1 } )
    

    【讨论】:

    • 这似乎是一个不错的小技巧,将所有键存储在一个数组字段中。感谢您的建议!
    猜你喜欢
    • 2014-12-25
    • 2018-10-27
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多