如果我在mongodb中有这样的数组结构:
"field":
[
[10,20] //specified length per array
[25,40]
[60,90]
...and so on, with various size per document
]
我如何索引这个子阵列? 我试图索引:db.ensureIndex({“field。$。0”:1}); //和{“field。$。1”:1}
但在文档中搜索仍然很慢。
我也试过这个解决方案: MongoDB, array of arrays index 但
db.ensureIndex("{field:[{"a":1}]}"); //and "{field:[{"b":1}]}"
如果命名子阵列索引a和b,则此sintax会抛出“坏索引键模式”异常。
答案 0 :(得分:3)
你能解释一下你想要做的更多吗?第一个架构设计不是很好;除了使用可能非常慢的数组运算符之外,你还有一堆你无法解决的数组。
看起来你的第二个想法是正确的,但你的语法只是一点点。如果你可以插入文档而不是子数组,你会发现模式更容易处理,你可以索引每个文档中的两个值,如下所示:
> db.test.insert({field: [{a:1, b:2}, {a:3, b:4}]})
> db.test.ensureIndex({"field.a":1})
> db.test.ensureIndex({"field.b":1})
> db.test.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "test.test",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"field.a" : 1
},
"ns" : "test.test",
"name" : "field.a_1"
},
{
"v" : 1,
"key" : {
"field.b" : 1
},
"ns" : "test.test",
"name" : "field.b_1"
}
]
> db.test.find({"field.a": 3})
{ "_id" : ObjectId("520e2ec749177daf439a2ff6"), "field" : [ { "a" : 1, "b" : 2 }, { "a" : 3, "b" : 4 } ] }
你可以运行一个解释,看看确实正在使用索引(参见光标线)
> db.test.find({"field.a": 3}).explain()
{
"cursor" : "BtreeCursor field.a_1",
"isMultiKey" : true,
"n" : 1,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"field.a" : [
[
3,
3
]
]
},
"server" : "xxxxx-PC:27017"
}