Mongodb đếm số bản ghi trong một bộ sưu tập java

Phương thức count() đếm số lượng tài liệu phù hợp với tiêu chí lựa chọn. Nó trả về số lượng tài liệu phù hợp với tiêu chí lựa chọn. Phải mất hai đối số đầu tiên là tiêu chí lựa chọn và đối số còn lại là tùy chọn.  

  • Phương pháp này tương đương với db. thu thập. tìm thấy(). đếm().  
  • Bạn không thể sử dụng phương pháp này trong các giao dịch
  • Một cụm được chia sẻ, nếu bạn sử dụng phương pháp này mà không có biến vị ngữ truy vấn, thì phương pháp này sẽ trả về số lượng không chính xác nếu tài liệu mồ côi tồn tại hoặc nếu quá trình di chuyển đoạn đang diễn ra. Vì vậy, để tránh tình huống như vậy, hãy sử dụng db. thu thập. phương thức tổng hợp()

cú pháp

db. Bộ sưu tập_Tên. đếm(

Tiêu chí lựa chọn,

{

    limit: ,

    skip: ,

    hint: ,

    maxTimeMS : ,

    readConcern: ,

    collation:  

})

Hoặc nếu chúng ta muốn đếm số lượng tài liệu trong bộ sưu tập thì sử dụng cú pháp này

db. Bộ sưu tập_name. đếm()

Thông số

  • Tham số đầu tiên là một tiêu chí lựa chọn. Loại tham số này là một tài liệu
  • Tham số thứ hai là tùy chọn

Thông số tùy chọn

  • giới hạn. Đó là số lượng tài liệu tối đa để đếm
  • nhảy. Đó là số tài liệu cần bỏ qua trước khi đếm
  • gợi ý. Đó là một tài liệu hoặc trường chỉ định chỉ mục sẽ sử dụng để hỗ trợ bộ lọc. Nó có thể lấy một tài liệu đặc tả chỉ mục hoặc chuỗi tên chỉ mục và nếu bạn chỉ định một chỉ mục không tồn tại thì nó sẽ báo lỗi
  • maxTimeMs. Đó là lượng thời gian tối đa để cho phép truy vấn chạy
  • đọc Quan tâm. Nó được sử dụng khi bạn không muốn sử dụng mối quan tâm đọc mặc định. Để sử dụng mức độ quan tâm đã đọc là "đa số", bạn phải chỉ định điều kiện truy vấn không trống
  • đối chiếu. Nó chỉ định việc sử dụng đối chiếu cho các hoạt động. Nó cho phép người dùng chỉ định các quy tắc dành riêng cho ngôn ngữ để so sánh chuỗi như quy tắc cho chữ cái và dấu trọng âm. Loại tham số này là một tài liệu

Trở lại.  

Phương thức này trả về số lượng tài liệu phù hợp với tiêu chí lựa chọn

ví dụ

Trong các ví dụ sau, chúng tôi đang làm việc với

cơ sở dữ liệu. gfg

bộ sưu tập. sinh viên

Tài liệu. Bốn tài liệu chứa tên và tuổi của các sinh viên

Mongodb đếm số bản ghi trong một bộ sưu tập java

  • Đếm số lượng tài liệu trong bộ sưu tập nhất định

Ở đây, ta đếm tổng số tài liệu trong tập sinh thỏa mãn điều kiện đã cho, i. e. , tuổi lớn hơn 18

/** * Tìm tất cả các DBObject từ cơ sở dữ liệu bằng truy vấn này. * Lưu ý 1. nó có thể thực hiện quét toàn bộ bảng nếu truy vấn không chứa khóa chỉ mục. * Lưu ý 2. nó sẽ tìm nạp tất cả nội dung vào bộ nhớ JVM thay vì sử dụng lazy loading. * Vì vậy, hãy chắc chắn rằng bạn chỉ gọi nó ở bộ sưu tập nhỏ, chẳng hạn như dữ liệu cấu hình. * * Truy vấn @param * @param databaseName * Không gian tên @param * Bộ sưu tập @param * Các trường @param * @return */ public static final ListqueryAllFromMongo(DBObject query, String databaseName, String namespace, String collection, DBObject fields, DBObject sortFields, int . đếm (truy vấn); . tìm (truy vấn, trường). bỏ qua(numToSkip). giới hạn(giới hạn); . = null ) { danh sách = danh sách. sắp xếp(sortField); . hasNext() ) { objList. thêm vào danh sách. tiếp theo());

Trong hướng dẫn này, chúng ta sẽ thấy các cách khác nhau để sử dụng Spring Data MongoDB để đếm tài liệu trong bộ sưu tập của chúng ta. Chúng tôi sẽ sử dụng tất cả các công cụ có sẵn trong MongoRepository

Chúng tôi sẽ sử dụng các chú thích, phương thức truy vấn và phương thức từ CrudRepository. Ngoài ra, chúng tôi sẽ xây dựng một dịch vụ đơn giản để tổng hợp các trường hợp sử dụng khác nhau của chúng tôi

2. Thiết lập trường hợp sử dụng

Trường hợp sử dụng của chúng tôi bao gồm lớp mô hình, kho lưu trữ và lớp dịch vụ. Ngoài ra, chúng tôi sẽ tạo một lớp kiểm tra để giúp chúng tôi đảm bảo mọi thứ đang hoạt động như dự kiến

2. 1. Tạo mô hình

Chúng tôi sẽ bắt đầu bằng cách tạo lớp mô hình của chúng tôi. Nó sẽ dựa trên một vài thuộc tính của một chiếc xe hơi

@Document
public class Car {
    private String name;

    private String brand;

    public Car(String brand) {
        this.brand = brand;
    }

    // getters and setters
}

Chúng tôi đang bỏ qua một thuộc tính ID vì chúng tôi sẽ không cần nó trong các ví dụ của mình. Ngoài ra, chúng tôi đang thêm một hàm tạo lấy thuộc tính thương hiệu làm tham số để giúp thử nghiệm dễ dàng hơn

2. 2. Xác định kho lưu trữ

Hãy xác định kho lưu trữ của chúng tôi mà không cần bất kỳ phương thức nào

public interface CarRepository extends MongoRepository {
}

Chúng tôi đang xem xét ID chuỗi, mặc dù chúng tôi không khai báo thuộc tính ID trong mô hình của mình. Điều này là do MongoDB tạo một ID duy nhất mặc định mà chúng ta vẫn có thể truy cập thông qua findById() nếu muốn

2. 3. Xác định lớp dịch vụ

Dịch vụ của chúng tôi sẽ tận dụng giao diện Kho lưu trữ dữ liệu mùa xuân theo những cách khác nhau

Hãy xác định nó với một tham chiếu đến kho lưu trữ của chúng tôi

@Service
public class CountCarService {

    @Autowired
    private CarRepository repo;
}

Chúng ta sẽ xây dựng dựa trên lớp này trong các phần tiếp theo, bao gồm các ví dụ

2. 4. chuẩn bị kiểm tra

Tất cả các thử nghiệm của chúng tôi sẽ chạy trên lớp dịch vụ của chúng tôi. Chúng tôi chỉ cần thiết lập một chút để không kết thúc với mã trùng lặp

public class CountCarServiceIntegrationTest {
    @Autowired
    private CountCarService service;

    Car car1 = new Car("B-A");

    @Before
    public void init() {
        service.insertCar(car1);
        service.insertCar(new Car("B-B"));
    }
}

Chúng tôi sẽ chạy khối này trước mỗi thử nghiệm để đơn giản hóa các kịch bản thử nghiệm của chúng tôi. Ngoài ra, chúng tôi đang xác định car1 bên ngoài init() để làm cho nó có thể truy cập được trong các thử nghiệm sau này

3. Sử dụng Kho lưu trữ Crud

Khi sử dụng MongoRepository, mở rộng CrudRepository, chúng tôi có quyền truy cập vào chức năng cơ bản, bao gồm phương thức đếm ()

3. 1. phương pháp đếm ()

Vì vậy, trong ví dụ đếm đầu tiên của chúng tôi, không có bất kỳ phương thức nào trong kho lưu trữ của chúng tôi, chúng tôi chỉ có thể gọi nó trong dịch vụ của mình

public long getCountWithCrudRepository() {
    return repo.count();
}

Và chúng ta có thể kiểm tra nó

@Test
public void givenAllDocs_whenCrudRepositoryCount_thenCountEqualsSize() {
    List all = service.findCars();

    long count = service.getCountWithCrudRepository();

    assertEquals(count, all.size());
}

Do đó, chúng tôi đảm bảo rằng số lượng () xuất ra cùng một số với kích thước của danh sách tất cả các tài liệu trong bộ sưu tập của chúng tôi

Quan trọng nhất, chúng ta phải nhớ rằng thao tác đếm sẽ tiết kiệm chi phí hơn so với việc liệt kê tất cả các tài liệu. Đây là cả về hiệu suất và giảm mã. Nó sẽ không tạo ra sự khác biệt với các bộ sưu tập nhỏ, nhưng với một bộ sưu tập lớn, chúng ta có thể gặp lỗi OutOfMemoryError. Nói tóm lại, không nên đếm tài liệu bằng cách liệt kê toàn bộ bộ sưu tập

3. 2. Lọc Sử dụng Đối tượng Ví dụ

CrudRepository cũng có thể hữu ích nếu chúng ta muốn đếm các tài liệu có giá trị thuộc tính cụ thể. Phương thức đếm () có phiên bản quá tải, nhận đối tượng Ví dụ

public long getCountWithExample(Car item) {
    return repo.count(Example.of(item));
}

Kết quả là, điều này đơn giản hóa nhiệm vụ. Bây giờ chúng ta chỉ cần điền vào một đối tượng các thuộc tính mà chúng ta muốn lọc và Spring sẽ làm phần còn lại. Hãy bao gồm nó trong các thử nghiệm của chúng tôi

@Test
public void givenFilteredDocs_whenExampleCount_thenCountEqualsSize() {
    long all = service.findCars()
      .stream()
      .filter(car -> car.getBrand().equals(car1.getBrand()))
      .count();

    long count = service.getCountWithExample(car1);

    assertEquals(count, all);
}

4. Sử dụng Chú thích @Query

Ví dụ tiếp theo của chúng ta sẽ dựa trên chú thích @Query

________số 8

Chúng ta phải chỉ định thuộc tính giá trị, nếu không Spring sẽ thử tạo truy vấn từ tên phương thức của chúng ta. Tuy nhiên, vì chúng tôi muốn đếm tất cả các tài liệu, chúng tôi chỉ cần chỉ định một truy vấn trống

Sau đó, chúng tôi xác định rằng kết quả của truy vấn này phải là một phép chiếu đếm bằng cách đặt thuộc tính đếm thành true

Hãy kiểm tra nó

@Test
public void givenAllDocs_whenQueryAnnotationCount_thenCountEqualsSize() {
    List all = service.findCars();

    long count = service.getCountWithQueryAnnotation();

    assertEquals(count, all.size());
}

4. 1. Lọc trên một tài sản

Chúng tôi có thể mở rộng ví dụ của mình, lọc theo thương hiệu. Hãy thêm một phương thức mới vào kho lưu trữ của chúng tôi

public interface CarRepository extends MongoRepository {
}
0

Trong giá trị truy vấn của chúng tôi, chúng tôi chỉ định truy vấn kiểu MongoDB đầy đủ của mình. Trình giữ chỗ “?0” đại diện cho tham số đầu tiên của phương thức của chúng tôi, đây sẽ là giá trị tham số truy vấn của chúng tôi

Các truy vấn MongoDB có cấu trúc JSON nơi chúng tôi chỉ định tên trường dọc theo các giá trị mà chúng tôi muốn lọc theo. Vì vậy, khi chúng ta gọi countBrand(“A”), truy vấn chuyển thành {brand. "MỘT"}. Điều này có nghĩa là chúng tôi sẽ lọc bộ sưu tập của mình theo các mặt hàng có thuộc tính thương hiệu có giá trị là “A”

5. Viết một phương thức truy vấn có nguồn gốc

Phương thức truy vấn dẫn xuất là bất kỳ phương thức nào bên trong kho lưu trữ của chúng tôi không bao gồm chú thích @Query có giá trị. Các phương thức này được Spring phân tích cú pháp theo tên nên chúng ta không phải viết truy vấn

Vì chúng ta đã có một phương thức count() trong CrudRepository của mình, hãy tạo một ví dụ đếm theo một thương hiệu cụ thể

public interface CarRepository extends MongoRepository {
}
1

Phương pháp này sẽ đếm tất cả các tài liệu có thuộc tính thương hiệu khớp với giá trị tham số

Bây giờ, hãy thêm nó vào dịch vụ của chúng tôi

public interface CarRepository extends MongoRepository {
}
2

Sau đó, chúng tôi đảm bảo phương thức của mình hoạt động chính xác bằng cách so sánh nó với thao tác đếm luồng đã lọc

public interface CarRepository extends MongoRepository {
}
3

Điều này hoạt động tốt khi chúng ta chỉ phải viết một vài truy vấn khác nhau. Tuy nhiên, nó có thể trở nên khó duy trì nếu chúng ta cần quá nhiều truy vấn đếm khác nhau

6. Sử dụng truy vấn đếm động với tiêu chí

Khi chúng ta cần thứ gì đó mạnh mẽ hơn một chút, chúng ta có thể sử dụng Tiêu chí với đối tượng Truy vấn

Tuy nhiên, để chạy Truy vấn, chúng tôi cần MongoTemplate. Nó được khởi tạo trong khi khởi động và có sẵn trong SimpleMongoRepository trong trường mongoOperations

Một cách để truy cập nó là mở rộng SimpleMongoRepository và tạo triển khai tùy chỉnh thay vì chỉ mở rộng MongoRepository. Nhưng, có một cách đơn giản hơn. Chúng tôi có thể đưa nó vào dịch vụ của mình

public interface CarRepository extends MongoRepository {
}
4

Sau đó, chúng ta có thể tạo phương thức đếm mới của mình, chuyển Truy vấn tới phương thức đếm () trong MongoTemplate

public interface CarRepository extends MongoRepository {
}
5

Cách tiếp cận này rất hữu ích khi chúng ta cần tạo các truy vấn động. Chúng tôi có toàn quyền kiểm soát cách tạo phép chiếu

6. 1. Lọc Sử dụng Đối tượng Ví dụ

Đối tượng Criteria cũng cho phép chúng ta truyền đối tượng Ví dụ

public interface CarRepository extends MongoRepository {
}
6

Điều này làm cho việc lọc theo thuộc tính dễ dàng hơn, trong khi vẫn cho phép các phần động

7. Phần kết luận

Trong bài viết này, chúng ta đã thấy các cách khác nhau để sử dụng phép chiếu đếm trong Spring Data MongoDB với các phương thức kho lưu trữ

Chúng tôi đã sử dụng các phương pháp có sẵn và cũng tạo ra những phương pháp mới bằng các cách tiếp cận khác nhau. Hơn nữa, chúng tôi đã tạo các bài kiểm tra bằng cách so sánh các phương pháp đếm của chúng tôi với việc liệt kê tất cả các đối tượng trong bộ sưu tập của chúng tôi. Tương tự như vậy, chúng tôi đã tìm hiểu lý do tại sao không nên đếm các tài liệu như vậy

Làm cách nào để đếm số lượng tài liệu trong bộ sưu tập MongoDB trong Java?

Đếm tài liệu .
CountDocuments() trả về số lượng tài liệu trong bộ sưu tập khớp với một truy vấn đã chỉ định. .
ước tínhDocumentCount() trả về ước tính số lượng tài liệu trong bộ sưu tập dựa trên siêu dữ liệu của bộ sưu tập

Làm cách nào để kiểm tra kích thước bộ sưu tập trong MongoDB?

totalSize() được sử dụng để báo cáo tổng kích thước của một bộ sưu tập, bao gồm kích thước của tất cả các tài liệu và tất cả các chỉ mục trên một bộ sưu tập. trả lại. Tổng kích thước tính bằng byte của dữ liệu trong bộ sưu tập cộng với kích thước của mọi chỉ mục trên bộ sưu tập.

Làm cách nào để đếm các giá trị riêng biệt trong MongoDB?

Để đếm các giá trị duy nhất, hãy sử dụng "distinct()" thay vì "find()" và "độ dài" thay vì "count()". The first argument for "distinct" is the field for which to aggregate distinct values, the second is the conditional statement that specifies which rows to select.

Làm cách nào để kiểm tra bản ghi trong MongoDB?

Trong Mongo DB, có tổng cộng sáu phương thức để truy xuất các bản ghi cụ thể. .
tìm thấy()
findAndModify()
tìm một()
findOneAndDelete()
findOneAndReplace()
findOneAndUpdate()