是否可以在Mongodb中为动态字段创建索引?

时间:2015-06-25 18:03:35

标签: mongodb

我的网站有多个"域名"代表网站的子部分。每个"域"拥有自己的用户配置文件,以及一个搜索页面,您可以根据用户填写的个人资料字段搜索用户。

来自'用户的用户数据'集合的结构如下:

{
    username: 'shawnmichaels',
    first_name: 'Shawn',
    last_name: 'Michaels',
    domains: [
        {
            name: 'domain1',
            user_fields: {
                'bio': 'Short bio related to domain 1',
                'skills': 'Pertinent skills for domain 1'
            }
        },
        {
            name: 'domain2',
            user_fields: {
                'bio': 'Short bio related to domain 2',
                'skills': 'Pertinent skills for domain 2'
            }
        }
    ]
}

因此,用户拥有跨多个域的字段数据。域名和字段名称是动态的。用户可能有数百个域,域中可能有数十个字段。

是否可以使用某种动态索引,以便我可以在' domain1'下搜索字段。没有在' domain2'中获得任何匹配?

例如,如果某个用户1在“域1”下面有"skills": ["karate", "judo"],并且我想搜索“域名2”以及“#34;空手道"”,我就不想要匹配对于user1。

1 个答案:

答案 0 :(得分:0)

对于任何有兴趣的人,经过一天的研究后,我已经回答了我自己的问题。

我是MongoDB的新手并没有意识到你可以像对待任何其他键一样对数组进行查询:

db.users.find({domains.title: 'domain1'})
// where 'domains' is an array of object each with a 'title' key

有了这些知识,我为每个想要搜索的字段添加了一个文本索引:

db.users.ensureIndex({
  'username': 'text',
  'first_name': 'text',
  'last_name': 'text',
  'domains.fields.bio': 'text',
  'domains.fields.skills': 'text',
  'domains.fields.title': 'text',
  'domains.fields.training': 'text'
}, {name: 'domain_search'})

我在每个域中构建了搜索查询,如下所示:

db.users.find({
  'domains.title': DOMAIN_NAME, 
  '$text': {'$search': SEARCH_TERM}
})