MongoDB có thể lưu trữ JSON không?

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách đọc dữ liệu JSON từ các tệp và nhập chúng vào MongoDB bằng Spring Boot. Điều này có thể hữu ích vì nhiều lý do. khôi phục dữ liệu, chèn hàng loạt dữ liệu mới hoặc chèn giá trị mặc định. MongoDB sử dụng JSON bên trong để cấu trúc các tài liệu của nó, do đó, đó là những gì chúng tôi sẽ sử dụng để lưu trữ các tệp có thể nhập được. Là văn bản thuần túy, chiến lược này cũng có ưu điểm là dễ nén

Ngoài ra, chúng ta sẽ tìm hiểu cách xác thực các tệp đầu vào của mình đối với các loại tùy chỉnh khi cần thiết. Cuối cùng, chúng tôi sẽ hiển thị một API để chúng tôi có thể sử dụng nó trong thời gian chạy trong ứng dụng web của mình

2. phụ thuộc

Hãy thêm các phụ thuộc Spring Boot này vào pom của chúng ta. xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

Chúng tôi cũng sẽ cần một phiên bản MongoDB đang chạy, phiên bản này yêu cầu một ứng dụng được định cấu hình đúng cách. tệp thuộc tính

3. Nhập chuỗi JSON

Cách đơn giản nhất để nhập JSON vào MongoDB là chuyển đổi nó thành một “org. con trai. đối tượng Document” đầu tiên. Lớp này đại diện cho một tài liệu MongoDB chung không có loại cụ thể. Do đó, chúng tôi không phải lo lắng về việc tạo kho lưu trữ cho tất cả các loại đối tượng mà chúng tôi có thể nhập

Chiến lược của chúng tôi lấy JSON (từ một tệp, tài nguyên hoặc chuỗi), chuyển đổi nó thành Tài liệu và lưu chúng bằng MongoTemplate. Các hoạt động hàng loạt thường hoạt động tốt hơn do số lượng các chuyến đi khứ hồi giảm so với việc chèn từng đối tượng riêng lẻ

Quan trọng nhất, chúng tôi sẽ coi đầu vào của mình chỉ có một đối tượng JSON trên mỗi ngắt dòng. Bằng cách đó, chúng ta có thể dễ dàng phân định các đối tượng của mình. Chúng tôi sẽ gói gọn các chức năng này thành hai lớp mà chúng tôi sẽ tạo. ImportUtils và ImportJsonService. Hãy bắt đầu với lớp dịch vụ của chúng tôi

@Service
public class ImportJsonService {

    @Autowired
    private MongoTemplate mongo;
}

Tiếp theo, hãy thêm một phương thức phân tích các dòng JSON vào tài liệu

private List<Document> generateMongoDocs(List<String> lines) {
    List<Document> docs = new ArrayList<>();
    for (String json : lines) {
        docs.add(Document.parse(json));
    }
    return docs;
}

Sau đó, chúng tôi thêm một phương thức chèn danh sách các đối tượng Tài liệu vào bộ sưu tập mong muốn. Ngoài ra, có thể thao tác hàng loạt bị lỗi một phần. Trong trường hợp đó, chúng tôi có thể trả lại số lượng tài liệu đã chèn bằng cách kiểm tra nguyên nhân của ngoại lệ

private int insertInto(String collection, List<Document> mongoDocs) {
    try {
        Collection<Document> inserts = mongo.insert(mongoDocs, collection);
        return inserts.size();
    } catch (DataIntegrityViolationException e) {
        if (e.getCause() instanceof MongoBulkWriteException) {
            return ((MongoBulkWriteException) e.getCause())
              .getWriteResult()
              .getInsertedCount();
        }
        return 0;
    }
}

Cuối cùng, hãy kết hợp các phương pháp đó. Cái này lấy đầu vào và trả về một chuỗi cho biết có bao nhiêu dòng đã được đọc so với. chèn thành công

public String importTo(String collection, List<String> jsonLines) {
    List<Document> mongoDocs = generateMongoDocs(jsonLines);
    int inserts = insertInto(collection, mongoDocs);
    return inserts + "/" + jsonLines.size();
}

4. Trường hợp sử dụng

Bây giờ chúng tôi đã sẵn sàng xử lý đầu vào, chúng tôi có thể xây dựng một số trường hợp sử dụng. Hãy tạo lớp ImportUtils để giúp chúng tôi làm điều đó. Lớp này sẽ chịu trách nhiệm chuyển đổi đầu vào thành các dòng JSON. Nó sẽ chỉ chứa các phương thức tĩnh. Hãy bắt đầu với cách đọc một Chuỗi đơn giản

public static List<String> lines(String json) {
    String[] split = json.split("[\\r\\n]+");
    return Arrays.asList(split);
}

Vì chúng tôi đang sử dụng ngắt dòng làm dấu phân cách, regex hoạt động rất tốt để ngắt chuỗi thành nhiều dòng. Regex này xử lý cả kết thúc dòng Unix và Windows. Tiếp theo, một phương pháp để chuyển đổi Tệp thành danh sách các chuỗi

public static List<String> lines(File file) {
    return Files.readAllLines(file.toPath());
}

Tương tự, chúng ta kết thúc với phương thức chuyển đổi tài nguyên đường dẫn lớp thành danh sách

public static List<String> linesFromResource(String resource) {
    Resource input = new ClassPathResource(resource);
    Path path = input.getFile().toPath();
    return Files.readAllLines(path);
}

4. 1. Nhập tệp trong khi khởi động với CLI

Trong trường hợp sử dụng đầu tiên của chúng tôi, chúng tôi sẽ triển khai chức năng nhập tệp qua đối số ứng dụng. Chúng ta sẽ tận dụng giao diện Spring Boot ApplicationRunner để thực hiện việc này khi khởi động. Chẳng hạn, chúng ta có thể đọc các tham số dòng lệnh để xác định tệp cần nhập

________số 8

Sử dụng getOptionValues() chúng tôi có thể xử lý một hoặc nhiều tệp. Các tệp này có thể từ đường dẫn lớp của chúng tôi hoặc từ hệ thống tệp của chúng tôi. Chúng tôi phân biệt chúng bằng RESOURCE_PREFIX. Mọi đối số bắt đầu bằng “classpath. ” sẽ được đọc từ thư mục tài nguyên của chúng tôi thay vì từ hệ thống tệp. Sau đó, tất cả chúng sẽ được nhập vào bộ sưu tập mong muốn

Hãy bắt đầu sử dụng ứng dụng của chúng ta bằng cách tạo một tệp trong src/main/resources/data. json. đăng nhập

{"name":"Book A", "genre": "Comedy"}
{"name":"Book B", "genre": "Thriller"}
{"name":"Book C", "genre": "Drama"}

Sau khi xây dựng, chúng ta có thể sử dụng ví dụ sau để chạy nó (thêm ngắt dòng để dễ đọc). Trong ví dụ của chúng tôi, hai tệp sẽ được nhập, một từ đường dẫn lớp và một từ hệ thống tệp

@Service
public class ImportJsonService {

    @Autowired
    private MongoTemplate mongo;
}
0

4. 2. Tệp JSON từ HTTP POST Tải lên

Ngoài ra, nếu chúng tôi tạo Bộ điều khiển REST, chúng tôi sẽ có một điểm cuối để tải lên và nhập các tệp JSON. Để làm được điều đó, chúng ta sẽ cần một tham số MultipartFile

@Service
public class ImportJsonService {

    @Autowired
    private MongoTemplate mongo;
}
1

Bây giờ chúng ta có thể nhập các tệp có POST như thế này, trong đó “/tmp/data. json” đề cập đến một tập tin hiện có

@Service
public class ImportJsonService {

    @Autowired
    private MongoTemplate mongo;
}
2

4. 3. Ánh xạ JSON tới một loại Java cụ thể

Chúng tôi chỉ sử dụng JSON, không bị ràng buộc với bất kỳ loại nào, đây là một trong những lợi thế khi làm việc với MongoDB. Bây giờ chúng tôi muốn xác thực đầu vào của chúng tôi. Trong trường hợp này, hãy thêm một ObjectMapper bằng cách thực hiện thay đổi này đối với dịch vụ của chúng tôi

@Service
public class ImportJsonService {

    @Autowired
    private MongoTemplate mongo;
}
3

Theo cách đó, nếu tham số loại được chỉ định, trình ánh xạ của chúng tôi sẽ cố phân tích chuỗi JSON của chúng tôi thành loại đó. Và, với cấu hình mặc định, sẽ đưa ra một ngoại lệ nếu có bất kỳ thuộc tính không xác định nào. Đây là định nghĩa bean đơn giản của chúng tôi để làm việc với kho lưu trữ MongoDB

@Service
public class ImportJsonService {

    @Autowired
    private MongoTemplate mongo;
}
4

Và bây giờ, để sử dụng phiên bản cải tiến của trình tạo Tài liệu của chúng tôi, hãy thay đổi cả phương pháp này

@Service
public class ImportJsonService {

    @Autowired
    private MongoTemplate mongo;
}
5

Bây giờ, thay vì chuyển tên của một bộ sưu tập, chúng tôi chuyển một Lớp. Chúng tôi cho rằng nó có chú thích Tài liệu như chúng tôi đã sử dụng trong Sách của mình, vì vậy nó có thể truy xuất tên bộ sưu tập. Tuy nhiên, vì cả hai lớp chú thích và Tài liệu đều có cùng tên nên chúng tôi phải chỉ định toàn bộ gói

5. Phần kết luận

Trong bài viết này, chúng ta đã thực hiện phá vỡ đầu vào JSON từ tệp, tài nguyên hoặc chuỗi đơn giản và nhập chúng vào MongoDB. Chúng tôi đã tập trung chức năng này vào một lớp dịch vụ và một lớp tiện ích để chúng tôi có thể sử dụng lại nó ở bất cứ đâu. Các trường hợp sử dụng của chúng tôi bao gồm tùy chọn CLI và REST, cùng với các lệnh ví dụ về cách sử dụng nó

Làm cách nào để lưu trữ tệp JSON trong MongoDB?

Cách nhập JSON vào MongoDB và chèn JSON vào la bàn MongoDB .
Bây giờ bạn phải chèn tệp JSON vào la bàn MongoDB, vì vậy hãy nhấp vào bộ sưu tập (sinh viên) mà bạn đã tạo
Nhấp vào nút nhập dữ liệu và chọn tệp bạn muốn nhập (tệp JSON) đồng thời chọn loại tệp đầu vào và nhấp vào nút nhập

Chúng tôi có thể chèn JSON vào MongoDB không?

Quá trình nhập JSON vào MongoDB tùy thuộc vào hệ điều hành và ngôn ngữ lập trình bạn đang sử dụng . Tuy nhiên, chìa khóa để nhập là truy cập cơ sở dữ liệu MongoDB và phân tích cú pháp tệp mà bạn muốn nhập. Sau đó, bạn có thể xem qua từng tài liệu một cách tuần tự và chèn vào MongoDB.

Bạn có thể lưu trữ JSON trong NoSQL không?

Bạn có thể lưu trữ tài liệu JSON trong SQL Server hoặc Cơ sở dữ liệu SQL và truy vấn dữ liệu JSON như trong cơ sở dữ liệu NoSQL . Bài viết này mô tả các tùy chọn để lưu trữ tài liệu JSON trong SQL Server hoặc Cơ sở dữ liệu SQL.

Làm cách nào để lưu trữ dữ liệu JSON trong MongoDB bằng Java?

Cách đơn giản nhất để nhập JSON vào MongoDB là chuyển nó thành “tổ chức. bson. Đối tượng tài liệu” trước . Lớp này đại diện cho một tài liệu MongoDB chung không có loại cụ thể.