.net MongoDB中的子文档索引
考虑MongoDB中的一组文档,这些文档表示具有类似结构的调查响应:.net MongoDB中的子文档索引,.net,mongodb,optimization,indexing,.net,Mongodb,Optimization,Indexing,考虑MongoDB中的一组文档,这些文档表示具有类似结构的调查响应: { _id: ... surveryId: ... created: ... answers: { "53ac9a031703670858aff600": "Yes", "53b1e8961703670aa858e4ec": "18364537", "53b1e8961703670aa858e4ee": "88422",
{
_id: ...
surveryId: ...
created: ...
answers: {
"53ac9a031703670858aff600": "Yes",
"53b1e8961703670aa858e4ec": "18364537",
"53b1e8961703670aa858e4ee": "88422",
...
"53b1e8961703670aa858e50a": NumberLong(2)
}
}
答案子文档中的每个条目表示用户对调查中单个问题的答案,调查中可能有数百个问题。此外,调查问题由用户创建,因此答案子文档的键可能因文档而异(即,另一个文档可能不包含“53ac9a031703670858aff600”)。问题本身存储在单独的调查集合中
为了能够快速检索调查回复(即显示问题A回答为“是”的所有调查回复),我尝试添加以下索引:
db.responses.ensureIndex({"answers": 1})
但是,在构建这个索引时,我得到错误“Btree::insert:key太大而无法索引”,这表明索引项的总大小超过1024字节
我的问题有两个:
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)]属性。