MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Làm cách nào chúng ta có thể tạo trường được tạo Tự động cho mongodb bằng cách sử dụng khởi động mùa xuân

MongoDB đi kèm với tất cả tính năng tạo ObjectId phức tạp, nhưng thường thì bạn chỉ cần chuyển từ cơ sở dữ liệu quan hệ và bạn vẫn muốn có một trường định danh số dễ đọc / giao tiếp. Trường này sẽ tự động tăng lên mỗi khi bản ghi mới được chèn vào.

Một gợi ý tuyệt vời từ hướng dẫn MongoDB là sử dụng bộ sưu tập bộ đếm với "tên bộ đếm" làm id của nó và trường "seq" để lưu trữ số được sử dụng gần đây nhất.

Khi phát triển bằng cách sử dụng Spring Data MongoDB, thủ thuật nhỏ gọn này có thể được viết như một dịch vụ đơn giản. Ở đây, tôi đã sử dụng tên bộ sưu tập làm tên bộ đếm để dễ đoán / dễ nhớ.

import static org.springframework.data.mongodb.core.FindAndModifyOptions.options;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import com.model.CustomSequences;


@Service
public class NextSequenceService {
    @Autowired private MongoOperations mongo;

    public int getNextSequence(String seqName)
    {
        CustomSequences counter = mongo.findAndModify(
            query(where("_id").is(seqName)),
            new Update().inc("seq",1),
            options().returnNew(true).upsert(true),
            CustomSequences.class);
        return counter.getSeq();
    }
}

CustomSequences chỉ là một lớp đơn giản đại diện cho bộ sưu tập. Hãy cẩn thận với việc sử dụng kiểu dữ liệu int, điều này sẽ giới hạn tối đa 2 ^ 31 mục nhập.

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "customSequences")
public class CustomSequences {
    @Id
    private String id;
    private int seq;

// getters and setters
}

Sau đó, khi chèn một mục mới (với sự trợ giúp của Spring MongoDB Repository hỗ trợ), chỉ cần đặt trường id như thế này trước khi bạn lưu nó

BaseQuestion baseQuestion = new BaseQuestion();
baseQuestion.setQuestionId(nextSequenceService.getNextSequence("customSequences"));
/* Rest all values */

baseQuestionRepository.save(baseQuestion);

Nếu bạn không thích cách này thì bạn cần sử dụng MongoDBEvents và sử dụng onBeforeConvert để tạo giá trị tự động bằng cách sử dụng cùng phương pháp ở trên.

Ngoài ra, cách tiếp cận ở trên là threadsafe vì findAndModify () là một phương thức nguyên tử an toàn cho luồng




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Truy vấn MongoDB với giá trị null

  2. MongoDB trả về True nếu tài liệu tồn tại

  3. làm thế nào để tôi có thể biết những cổng mongo đang lắng nghe từ trình bao mongo?

  4. MongoDB $ dateFromParts

  5. Mức độ không an toàn của MongoDB và Cách tránh chúng