Toán tử $in trong MongoDB cho phép tìm các tài liệu có trường mảng chứa ít nhất một giá trị từ danh sách cho trước. Kết hợp với count() hoặc xử lý ở application layer, có thể thống kê số lượng tag khớp.
Tạo dữ liệu mẫu
> db.tagCountDemo.insertOne({"ListOfNames":["John","Sam","Carol"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd64b387924bb85b3f48944") }
> db.tagCountDemo.insertOne({"ListOfNames":["Bob","David","John"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd64b4b7924bb85b3f48945") }
> db.tagCountDemo.insertOne({"ListOfNames":["Mike","Robert","Chris"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd64b5d7924bb85b3f48946") }
> db.tagCountDemo.insertOne({"ListOfNames":["James","Carol","Jace"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd64b717924bb85b3f48947") }
Xem tất cả tài liệu
> db.tagCountDemo.find().pretty();
Tìm tài liệu chứa 'John' HOẶC 'Carol'
> db.tagCountDemo.find({"ListOfNames": {$in: ['John','Carol']}});Kết quả
Đếm số tài liệu khớp
> db.tagCountDemo.find({"ListOfNames": {$in: ['John','Carol']}}).count();Kết quả: 3
Nâng cao: Đếm số lần xuất hiện của từng tên
Sử dụng Aggregation Pipeline để thống kê chi tiết:
db.tagCountDemo.aggregate([ {$unwind: "$ListOfNames"}, {$match: {ListOfNames: {$in: ["John", "Carol"]}}}, {$group: {_id: "$ListOfNames", count: {$sum: 1}}}, {$sort: {count: -1}} ]);Kết quả aggregation
Giải thích pipeline
$unwind: Phân tách mảng thành các tài liệu riêng biệt cho mỗi phần tử$match: Lọc chỉ giữ "John" và "Carol"$group: Nhóm theo tên và đếm số lần xuất hiện$sort: Sắp xếp giảm dần theo số lượngLưu ý
$intrên mảng: Khớp nếu ít nhất một phần tử trong mảng tài liệu nằm trong danh sách truy vấn- Tạo index trên trường mảng để tối ưu:
db.tagCountDemo.createIndex({ListOfNames: 1}) - MongoDB 3.2+: Dùng
countDocuments()thaycount()