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

Đếm tag trong MongoDB dựa trên danh sách tên

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

  1. $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ử
  2. $match: Lọc chỉ giữ "John" và "Carol"
  3. $group: Nhóm theo tên và đếm số lần xuất hiện
  4. $sort: Sắp xếp giảm dần theo số lượng

Lưu ý

  • $in trê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() thay count()