我有以下示例文档:
{
"_id" : ObjectId("556e177ca43da29e040041a7"),
"user_id" : NumberLong(24),
"request_datetime" : ISODate("2015-06-02T15:52:12.000-05:00"),
"total_amount" : 102.62,
"status" : NumberLong(1),
"adfields" : {
"27" : "413703562015060200132",
"28" : "S003POS4",
"29" : "HAYLEYS",
"30" : "1"
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我需要索引“adfields”属性,但它不适用于“多键”索引类型,也不使用“单字段索引”。我尝试使用单个字段索引来索引adfields属性,但是当我查询adfields.27的特定值时,它不使用索引。我无法为adfields.27创建单个字段索引,因为这些数字是动态创建的。
您知道如何执行此操作吗?多谢。
小智 3
改变你的模型后我能够完成这项工作。希望这仍然能满足您的目标用例。为了绕过字段的动态特性,我创建了一个名为“field”的字段和一个名为“value”的字段。这允许我在已知字段上创建多键索引。
db.myColl.insert(
{
"user_id" : NumberLong(24),
"request_datetime" : ISODate("2015-06-02T15:52:12.000-05:00"),
"total_amount" : 102.62,
"status" : NumberLong(1),
"adfields" : [
{field:"27", value : "413703562015060200132"},
{field:"28", value: "S003POS4"},
{field:"29", value: "HAYLEYS"},
{field:"30", value: "1"}
]
})
Run Code Online (Sandbox Code Playgroud)
然后我针对 db.myColl.find({"adfield.field":"30"}) 执行了查找,以获取查询的前图片。我还使用了 db.myColl.explain().find() 来分析它。
然后我通过 db.myColl.createIndex({"adfield.field"1,"adfield.value":1"}) 创建索引。
我执行了上面的查找,果然我看到了 IXScan,并且在explain() 输出中 isMultiKey 为 true。
再次; 希望对模型的改变仍然符合您试图实现的目标的精神。
您可以通过http://docs.mongodb.org/manual/core/index-multikey/阅读有关 mutlikey 的更多详细信息。