Đếm số lượng phần tử mảng trong MongoDB
Cách đơn giản nhất: dùng .length trên kết quả findOne() trong mongo shell.
1. Dữ liệu mẫu
> db.demo440.insertOne({ Name: "Chris", ListOfFriends: ["John", "Sam", "Mike"] });
> db.demo440.insertOne({ Name: "David", ListOfFriends: ["Mike", "Bob", "Carol"] });
2. Đếm bạn bè của David
> db.demo440.findOne({ 'Name': 'David' }).ListOfFriends.length;
3
Các cách khác (trong aggregation)
// Cách 1: $size (chỉ dùng trong $project, $match aggregation)
db.demo440.aggregate([
{ $match: { Name: "David" } },
{ $project: { friendCount: { $size: "$ListOfFriends" } } }
]);
// Cách 2: $addFields (MongoDB 3.4+)
db.demo440.aggregate([
{ $match: { Name: "David" } },
{ $addFields: { friendCount: { $size: "$ListOfFriends" } } }
]);
So sánh các phương pháp
| Phương pháp | Môi trường | Ưu điểm | Nhược điểm |
|---|---|---|---|
| .length (shell) | Mongo Shell | Đơn giản, nhanh cho 1 doc | Chỉ dùng trong shell, không dùng trong app driver |
| $size (aggregation) | Driver, Shell | Dùng trong pipeline, kết hợp với $match | Không dùng index |
| $expr + $size (find) | MongoDB 3.6+ | Dùng trực tiếp trong find() | Không dùng index |
Ví dụ dùng trong find() (MongoDB 3.6+)
// Tìm người có đúng 3 bạn bè
db.demo440.find({ $expr: { $eq: [{ $size: "$ListOfFriends" }, 3] } });
// Tìm người có > 2 bạn bè
db.demo440.find({ $expr: { $gt: [{ $size: "$ListOfFriends" }, 2] } });
Lưu ý quan trọng
$sizekhông sử dụng index → chậm trên collection lớn- Giải pháp: Lưu trường
friendCountriêng và cập nhật khi push/pull, rồi index trường đó - Tránh dùng
$where(JS) để đếm - rất chậm và không an toàn