Bạn có thể làm:
> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})
Điều này được thảo luận trong tài liệu dưới chỉ mục-trên-trường-nhúng và chỉ mục trên tài liệu phụ
Phần quan trọng của phần tài liệu phụ là 'Khi thực hiện đối sánh bình đẳng trên các tài liệu con, các vấn đề thứ tự thực địa và các tài liệu con phải khớp chính xác.'
Điều này có nghĩa là 2 chỉ mục giống nhau đối với các truy vấn đơn giản.
Tuy nhiên, như ví dụ về tài liệu con cho thấy, bạn có thể nhận được một số kết quả thú vị (mà bạn có thể không mong đợi) nếu bạn chỉ lập chỉ mục toàn bộ tài liệu con thay vì một trường cụ thể và sau đó thực hiện một toán tử so sánh (như $gte
) - nếu bạn lập chỉ mục một trường con cụ thể, bạn sẽ nhận được một chỉ mục kém linh hoạt hơn, nhưng có khả năng hữu ích hơn.
Tất cả thực sự phụ thuộc vào trường hợp sử dụng của bạn.
Dù sao, khi bạn đã tạo chỉ mục, bạn có thể kiểm tra những gì được tạo bằng:
> db.collection.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "test.collection",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"data.name" : 1,
"data.age" : 1,
"data.job" : 1
},
"ns" : "test.collection",
"name" : "data.name_1_data.age_1_data.job_1"
}
]
Như bạn có thể thấy từ đầu ra, nó đã tạo một khóa mới có tên là data.name_1_data.age_1_data.job_1
(_id_
chỉ mục luôn được tạo).
Nếu bạn muốn kiểm tra chỉ mục mới của mình thì bạn có thể thực hiện:
> db.collection.insert({data:{name: "A",age:"B", job : "C"}})
> db.collection.insert({data:{name: "A1",age:"B", job : "C"}})
> db.collection.find({"data.name" : "A"}).explain()
{
"cursor" : "BtreeCursor data.name_1_data.age_1_data.job_1",
.... more stuff
Điều chính là bạn có thể thấy rằng chỉ mục mới của mình đã được sử dụng ( BtreeCursor data.name_1_data.age_1_data.job_1 trong trường con trỏ là những gì cho biết đây là trường hợp). Nếu bạn thấy "cursor" : "BasicCursor"
, thì chỉ mục của bạn đã không được sử dụng.
Để biết thêm thông tin chi tiết, hãy xem tại đây.