Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Đếm số phần tử trong mảng MongoDB

Đế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ápMôi trườngƯu điểmNhược điểm
.length (shell)Mongo ShellĐơn giản, nhanh cho 1 docChỉ dùng trong shell, không dùng trong app driver
$size (aggregation)Driver, ShellDùng trong pipeline, kết hợp với $matchKhô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

  • $size không sử dụng index → chậm trên collection lớn
  • Giải pháp: Lưu trường friendCount riê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