.net MongoDB中的子文档索引

.net MongoDB中的子文档索引,.net,mongodb,optimization,indexing,.net,Mongodb,Optimization,Indexing,考虑MongoDB中的一组文档,这些文档表示具有类似结构的调查响应: { _id: ... surveryId: ... created: ... answers: { "53ac9a031703670858aff600": "Yes", "53b1e8961703670aa858e4ec": "18364537", "53b1e8961703670aa858e4ee": "88422",

考虑MongoDB中的一组文档,这些文档表示具有类似结构的调查响应:

{
    _id: ...  
    surveryId: ...  
    created: ...  
    answers: {  
        "53ac9a031703670858aff600": "Yes",  
        "53b1e8961703670aa858e4ec": "18364537",  
        "53b1e8961703670aa858e4ee": "88422",  
        ...  
        "53b1e8961703670aa858e50a": NumberLong(2)  
    }  
}  
答案子文档中的每个条目表示用户对调查中单个问题的答案,调查中可能有数百个问题。此外,调查问题由用户创建,因此答案子文档的键可能因文档而异(即,另一个文档可能不包含“53ac9a031703670858aff600”)。问题本身存储在单独的调查集合中

为了能够快速检索调查回复(即显示问题A回答为“是”的所有调查回复),我尝试添加以下索引:

db.responses.ensureIndex({"answers": 1})
但是,在构建这个索引时,我得到错误“Btree::insert:key太大而无法索引”,这表明索引项的总大小超过1024字节

我的问题有两个:

  • 是否有一种方法可以批量索引answers子文档,以便我可以发出类似于
    db.responses.find的查询({“answers.53ac9a031703670858aff600:“Yes”})
    并且该查询命中了索引

  • 如果我无法创建一个涵盖整个答案子文档的索引,那么我有哪些选项可以确保可以使用索引检索任何调查答案?我是否应该考虑一个新的文档设计以应对?


  • 访问此数据的应用程序是使用官方MongoDB驱动程序的.NET应用程序。

    您使用的是MongoDB反模式:值键

    不要将值(在本例中是来自另一个集合的ObjectId)用作(子)文档的键

  • 很难对它进行任何高级查询,因为有许多运算符处理值,但几乎没有一个运算符处理键
  • 索引是不可能的,因为您只能在已知键上创建索引
  • 使用键值对数组代替包含大量未知字段的对象:

    answers: [  
        { "question": "53ac9a031703670858aff600", "answer": "Yes" },
        { "question": "53b1e8961703670aa858e4ec", "answer": "18364537" },
        { "question": "53b1e8961703670aa858e4ee", "answer": "88422" },
        { "question": "53b1e8961703670aa858e50a", "answer": NumberLong(2) }
    ]
    

    然后,您可以在
    answers.question
    上创建索引以快速查找任何问题,或在这两个字段上创建复合索引以快速查找特定的问题/答案组合。如果要避免重复,创建一个独特的组合索引,将
    \u id
    答案组合在一起。问题

    为将来可能会使用.NET驱动程序的观众提供一个提示:我们已经将答案数组建模为一个字典,并且能够告诉.NET Mongo驱动程序使用[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]属性。