2012-03-14 38 views
6

Tôi đang cố gắng tìm ra cách tôi phải cấu trúc các truy vấn sao cho chúng sẽ đạt được chỉ mục của tôi. Tôi có tài liệu có cấu trúc như sau:MongoDB - Truy vấn trên trường lồng nhau với chỉ mục

{ "attributes" : { "make" : "Subaru", "color" : "Red" } } 

Với một chỉ số của: db.stuff.ensureIndex({"attributes.make":1})

Những gì tôi đã tìm thấy là truy vấn sử dụng ký hiệu dấu chấm đánh chỉ số trong khi truy vấn với một tài liệu thì không.

Ví dụ:

db.stuff.find({"attributes.make":"Subaru"}).explain() 
{ 
"cursor" : "BtreeCursor attributes.make_1", 
"nscanned" : 2, 
"nscannedObjects" : 2, 
"n" : 2, 
"millis" : 0, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 
    "attributes.make" : [ 
     [ 
      "Subaru", 
      "Subaru" 
     ] 
    ] 
} 
} 

vs

db.stuff.find({attributes:{make:"Subaru"}}).explain() 
{ 
"cursor" : "BasicCursor", 
"nscanned" : 2, 
"nscannedObjects" : 2, 
"n" : 0, 
"millis" : 1, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 

} 
} 

Có cách nào để có được những truy vấn phong cách tài liệu để đạt chỉ số? Lý do là khi xây dựng các truy vấn từ các đối tượng liên tục của tôi, việc tuần tự hóa chúng trở nên dễ dàng hơn nhiều như các tài liệu trái ngược với một cái gì đó sử dụng ký pháp chấm.

Tôi cũng sẽ thêm rằng chúng tôi đang sử dụng lớp bản đồ dữ liệu được phát triển tại nhà được xây dựng w/Jackson. Sẽ sử dụng một cái gì đó như Morphia giúp với việc xây dựng đúng các truy vấn này?

Trả lời

7

Thực hiện thêm một số thao tác và this thread giải thích điều gì sẽ xảy ra với truy vấn tài liệu phụ. Vấn đề của tôi ở trên là làm cho hành động truy vấn dựa trên tài liệu phụ giống như dấu chấm tôi cần sử dụng elemMatch.

db.stuff.find({"attributes":{"$elemMatch" : {"make":"Subaru"}}}).explain() 
{ 
"cursor" : "BtreeCursor attributes.make_1", 
"nscanned" : 2, 
"nscannedObjects" : 2, 
"n" : 0, 
"millis" : 2, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 
    "attributes.make" : [ 
     [ 
      "Subaru", 
      "Subaru" 
     ] 
    ] 
} 
} 
Các vấn đề liên quan