MongoDB tự động tạo chỉ mục cho từng giá trị trong mảng (multikey index), cho phép bạn truy vấn các phần tử đơn lẻ bên trong mảng.
Ví dụ minh họa
Tạo collection và dữ liệu
> db.indexingForArrayElementDemo.insertOne({"StudentFavouriteSubject":["MongoDB","MySQL"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8acdca6cea1f28b7aa0816") }
Xem dữ liệu
> db.indexingForArrayElementDemo.find().pretty();
{
"_id" : ObjectId("5c8acdca6cea1f28b7aa0816"),
"StudentFavouriteSubject" : [ "MongoDB", "MySQL" ]
}
Tạo index cho trường mảng
> db.indexingForArrayElementDemo.ensureIndex({"StudentFavouriteSubject":1});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
MongoDB tạo một multikey index - một index entry cho mỗi phần tử trong mảng.
Truy vấn phần tử trong mảng
> db.indexingForArrayElementDemo.find({"StudentFavouriteSubject":"MongoDB"}).pretty();
{
"_id" : ObjectId("5c8acdca6cea1f28b7aa0816"),
"StudentFavouriteSubject" : [ "MongoDB", "MySQL" ]
}
> db.indexingForArrayElementDemo.find({"StudentFavouriteSubject":"MySQL"}).pretty();
{
"_id" : ObjectId("5c8acdca6cea1f28b7aa0816"),
"StudentFavouriteSubject" : [ "MongoDB", "MySQL" ]
}
Đặc điểm quan trọng của Multikey Index
- Tự động: MongoDB tự động tạo multikey index khi bạn index trường là mảng
- Mỗi phần tử = một index entry: Mảng có 100 phần tử → 100 index entries
- Hỗ trợ truy vấn: Có thể tìm document chứa bất kỳ giá trị nào trong mảng
- Giới hạn: Không thể tạo compound multikey index trên 2 trường mảng cùng lúc
Kiểm tra index type
> db.indexingForArrayElementDemo.getIndexes();
[
{ "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" },
{ "v" : 2, "key" : { "StudentFavouriteSubject" : 1 }, "name" : "StudentFavouriteSubject_1" }
]
Index StudentFavouriteSubject_1 là multikey index (MongoDB không hiển thị rõ ràng là multikey trong output nhưng hoạt động như vậy).