Hướng dẫn how to store enum in mongodb - cách lưu trữ enum trong mongodb

TL; DR: Chuỗi có lẽ là sự lựa chọn an toàn hơn và sự khác biệt về hiệu suất nên không đáng kể. Các số nguyên có ý nghĩa đối với các bộ sưu tập lớn trong đó enum phải được lập chỉ mục. Ymmv.

Tôi đã nghĩ đến việc lưu trữ nó bằng các số nguyên mà tôi cho rằng sử dụng ít không gian hơn là lưu trữ các chuỗi cho mọi thứ có thể dễ dàng được thể hiện dưới dạng một số nguyên

True.

Mặt khác tôi thấy khi sử dụng số nguyên là nếu tôi muốn đổi tên thành tích hoặc thứ hạng, tôi có thể dễ dàng thay đổi nó mà không phải chạm vào cơ sở dữ liệu.

Đây là một lợi ích chính của số nguyên theo ý kiến ​​của tôi. Tuy nhiên, nó cũng đòi hỏi bạn phải đảm bảo các giá trị liên quan của

import org.bson.codecs.pojo.ClassModel;
import org.bson.codecs.pojo.PojoCodecProvider;
import org.bson.codecs.pojo.PojoCodecProvider.Builder;
import com.ps2pdf.models.enums.ProcessType; // Local
...
Builder builder = <your mongo builder>
ClassModel<ProcessType> classModel = ClassModel.builder(ProcessType.class).build();
builder.register(classModel);
1 không thay đổi. Nếu bạn vặn nó lên, bạn gần như chắc chắn sẽ tàn phá, đó là một bất lợi lớn.almost certainly wreak havoc, which is a huge disadvantage.

Một lợi ích tôi thấy khi sử dụng chuỗi là dữ liệu đòi hỏi ít xử lý hơn trước khi nó được sử dụng

Nếu bạn thực sự sử dụng một loại dữ liệu enum, có lẽ đó là một số nguyên trong nội bộ, vì vậy số nguyên nên yêu cầu ít xử lý hơn. Dù bằng cách nào, chi phí đó nên không đáng kể.

Có một lý do mạnh mẽ để sử dụng số nguyên hoặc chuỗi?

Tôi đang lặp lại rất nhiều những gì đã nói, nhưng có lẽ điều đó giúp các độc giả khác. Tổng hợp:

  • Trộn giá trị ENUM HAVOCS HAVOC. Hãy tưởng tượng các quốc gia
    import org.bson.codecs.pojo.ClassModel;
    import org.bson.codecs.pojo.PojoCodecProvider;
    import org.bson.codecs.pojo.PojoCodecProvider.Builder;
    import com.ps2pdf.models.enums.ProcessType; // Local
    ...
    Builder builder = <your mongo builder>
    ClassModel<ProcessType> classModel = ClassModel.builder(ProcessType.class).build();
    builder.register(classModel);
    
    2 của bạn đột nhiên được hiểu là
    import org.bson.codecs.pojo.ClassModel;
    import org.bson.codecs.pojo.PojoCodecProvider;
    import org.bson.codecs.pojo.PojoCodecProvider.Builder;
    import com.ps2pdf.models.enums.ProcessType; // Local
    ...
    Builder builder = <your mongo builder>
    ClassModel<ProcessType> classModel = ClassModel.builder(ProcessType.class).build();
    builder.register(classModel);
    
    3, bởi vì
    import org.bson.codecs.pojo.ClassModel;
    import org.bson.codecs.pojo.PojoCodecProvider;
    import org.bson.codecs.pojo.PojoCodecProvider.Builder;
    import com.ps2pdf.models.enums.ProcessType; // Local
    ...
    Builder builder = <your mongo builder>
    ClassModel<ProcessType> classModel = ClassModel.builder(ProcessType.class).build();
    builder.register(classModel);
    
    2 có giá trị '2' và bây giờ là
    import org.bson.codecs.pojo.ClassModel;
    import org.bson.codecs.pojo.PojoCodecProvider;
    import org.bson.codecs.pojo.PojoCodecProvider.Builder;
    import com.ps2pdf.models.enums.ProcessType; // Local
    ...
    Builder builder = <your mongo builder>
    ClassModel<ProcessType> classModel = ClassModel.builder(ProcessType.class).build();
    builder.register(classModel);
    
    3 vì bạn đã sắp xếp lại enum và quên gán các giá trị theo cách thủ công ... (rùng mình)
  • Chuỗi biểu cảm hơn
  • Số nguyên mất ít không gian hơn. Không gian đĩa không quan trọng, thông thường, nhưng không gian chỉ số sẽ ăn RAM đắt tiền.
  • Cập nhật số nguyên không thay đổi kích thước đối tượng. Chuỗi, nếu độ dài của chúng khác nhau rất nhiều, có thể yêu cầu phân bổ lại. Tuy nhiên, yếu tố đệm và đệm nên làm giảm bớt điều này.
  • Các số nguyên có thể là cờ (chưa thể truy vấn (chưa), thật không may, xem Server-3518)
  • Các số nguyên có thể được truy vấn bởi
    import org.bson.codecs.pojo.ClassModel;
    import org.bson.codecs.pojo.PojoCodecProvider;
    import org.bson.codecs.pojo.PojoCodecProvider.Builder;
    import com.ps2pdf.models.enums.ProcessType; // Local
    ...
    Builder builder = <your mongo builder>
    ClassModel<ProcessType> classModel = ClassModel.builder(ProcessType.class).build();
    builder.register(classModel);
    
    6 /
    import org.bson.codecs.pojo.ClassModel;
    import org.bson.codecs.pojo.PojoCodecProvider;
    import org.bson.codecs.pojo.PojoCodecProvider.Builder;
    import com.ps2pdf.models.enums.ProcessType; // Local
    ...
    Builder builder = <your mongo builder>
    ClassModel<ProcessType> classModel = ClassModel.builder(ProcessType.class).build();
    builder.register(classModel);
    
    7 để bạn có thể thực hiện hiệu quả các truy vấn
    import org.bson.codecs.pojo.ClassModel;
    import org.bson.codecs.pojo.PojoCodecProvider;
    import org.bson.codecs.pojo.PojoCodecProvider.Builder;
    import com.ps2pdf.models.enums.ProcessType; // Local
    ...
    Builder builder = <your mongo builder>
    ClassModel<ProcessType> classModel = ClassModel.builder(ProcessType.class).build();
    builder.register(classModel);
    
    8 phức tạp, mặc dù đó là một yêu cầu khá phức tạp và không có gì sai với các truy vấn
    import org.bson.codecs.pojo.ClassModel;
    import org.bson.codecs.pojo.PojoCodecProvider;
    import org.bson.codecs.pojo.PojoCodecProvider.Builder;
    import com.ps2pdf.models.enums.ProcessType; // Local
    ...
    Builder builder = <your mongo builder>
    ClassModel<ProcessType> classModel = ClassModel.builder(ProcessType.class).build();
    builder.register(classModel);
    
    8 ...

Hướng dẫn how to store enum in mongodb - cách lưu trữ enum trong mongodb

Hướng dẫn how to store enum in mongodb - cách lưu trữ enum trong mongodb

Nếu bạn muốn lưu giá trị enum java vào db dưới dạng tên enum, thì trình điều khiển Mongo sẽ hỗ trợ điều đó. Ví dụ: nếu bạn có một enum

public enum ProcessType {
    CONVERT_ONE_TO_ONE,
    CONVERT_ONE_TO_MANY;
}

Nhập chế độ FullScreenen EXIT Mode FullScreen

và nó được đăng ký với nhà cung cấp codec Mongo là

import org.bson.codecs.pojo.ClassModel;
import org.bson.codecs.pojo.PojoCodecProvider;
import org.bson.codecs.pojo.PojoCodecProvider.Builder;
import com.ps2pdf.models.enums.ProcessType; // Local
...
Builder builder = <your mongo builder>
ClassModel<ProcessType> classModel = ClassModel.builder(ProcessType.class).build();
builder.register(classModel);

Nhập chế độ FullScreenen EXIT Mode FullScreen

Sau đó, bất cứ khi nào bạn lưu một thể hiện của một lớp với một loại thuộc tính ProcessType vào DB, tài liệu Mongo kết quả sẽ có giá trị chuỗi

export enum WebsocketProcessType {
    CONVERT_ONE_TO_ONE = 'convert-one-to-one',
    CONVERT_ONE_TO_MANY = 'convert-one-to-many',
}
0 hoặc
export enum WebsocketProcessType {
    CONVERT_ONE_TO_ONE = 'convert-one-to-one',
    CONVERT_ONE_TO_MANY = 'convert-one-to-many',
}
1 cho thuộc tính đó.

Nếu đó là tất cả những gì bạn cần, thì điều sau đây không dành cho bạn. Trong trường hợp đó, bạn có thể làm theo hướng dẫn của Mongo Pojo để hướng dẫn bạn.

Sau đây là một cách để lưu trữ giá trị liên quan đến enum java trong MongoDB. Tại sao ai đó muốn làm điều đó?

  • Java (cũng TypeScript) có quy ước sử dụng tên trường hợp trên trong enums, có lẽ được kế thừa từ việc sử dụng tên chữ hoa cho các hằng số.
  • Tôi thích gán các giá trị chữ thường cho các thuộc tính đối tượng (như nhiều người làm)
  • Ngăn chặn tên tài sản buộc vào giá trị của nó. Tôi thích giữ ngắn tên biến và giá trị được gán cho nó có thể là bất cứ điều gì.

Trên đây là một vài lý do để lưu các giá trị enum thay vì tên vào MongoDB.

Một điểm đau khác đối với tôi là so sánh các giá trị enum được giải mã ở phía trước. Sau đây là enum TypeScript Front-end cho Java enum trên.

export enum WebsocketProcessType {
    CONVERT_ONE_TO_ONE = 'convert-one-to-one',
    CONVERT_ONE_TO_MANY = 'convert-one-to-many',
}

Nhập chế độ FullScreenen EXIT Mode FullScreen

Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.

Với hướng dẫn dưới đây và việc sử dụng biến áp lớp để giải mã dữ liệu được gửi từ phụ trợ, bạn sẽ có thể ánh xạ liền mạch các lớp Java thành các lớp TypeScript (JS).

Thực hiện

Steps:

  1. Tạo và đăng ký một nhà cung cấp codec với Cơ quan đăng ký mã Mongo mà Mongo sử dụng để xác định bộ giải mã enum nào để sử dụng giá trị enum java
  2. Tạo và đăng ký Bộ giải mã Enum cho
    export enum WebsocketProcessType {
        CONVERT_ONE_TO_ONE = 'convert-one-to-one',
        CONVERT_ONE_TO_MANY = 'convert-one-to-many',
    }
    
    2
  3. Tạo và đăng ký Enum với DB

Tôi sẽ làm cho một số lớp là chung chung vì điều này có thể được sử dụng để giải mã tất cả các enum.

Tạo nhà cung cấp codec

Tôi sẽ không cung cấp nhập khẩu vì bạn nên có Trình điều khiển Mongo Java và với IDE hiện đại, bạn có thể tự động nhập tất cả nhập khẩu.

public class EnumCodecProvider implements CodecProvider {
    @Override
    public <T> Codec<T> get(Class<T> clazz, CodecRegistry registry) {
        if (clazz == ProcessType.class) {
            return (Codec<T>) new ProcessTypeCodec();
        } 
        return null; // Don't throw here, this tells Mongo this provider doesn't provide a decoder for the requested clazz
    }
}

Nhập chế độ FullScreenen EXIT Mode FullScreen

Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.

CodecRegistry pojoCodecRegistry = 
                fromRegistries(MongoClient.getDefaultCodecRegistry(),
                    CodecRegistries.fromRegistries(
                        CodecRegistries.fromProviders(new EnumCodecProvider())
                    ), 
                );
MongoClientOptions options = MongoClientOptions.builder().codecRegistry(pojoCodecRegistry).build();
// Register above option with the MongoClient

Nhập chế độ FullScreenen EXIT Mode FullScreen

Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.

Với hướng dẫn dưới đây và việc sử dụng biến áp lớp để giải mã dữ liệu được gửi từ phụ trợ, bạn sẽ có thể ánh xạ liền mạch các lớp Java thành các lớp TypeScript (JS).

Thực hiện

abstract class AbstractCodec<T extends Enum<T>> implements Codec<T> {
    public AbstractCodec() {
    }

    @Override
    final public void encode(final BsonWriter writer, final T value, final EncoderContext encoderContext) {
        String val = ((Enum) value).toString();
        writer.writeString(val);
    }

    @Override
    final public T decode(final BsonReader reader, final DecoderContext decoderContext) {
        try {
            String value = reader.readString();
            Method method = getEncoderClass().getDeclaredMethod("fromValue", String.class);
            T enumName = (T) method.invoke(null, value);
            return enumName;
        }catch(Exception e) {
            try {
                String value = reader.readString();
                Method method = getEncoderClass().getDeclaredMethod("getDefaultValue");
                T storageType = (T) method.invoke(null, value);
                return storageType;
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }
        return null;
    }

    public abstract Class<T> getEncoderClass();
}

Nhập chế độ FullScreenen EXIT Mode FullScreen

Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.

Với hướng dẫn dưới đây và việc sử dụng biến áp lớp để giải mã dữ liệu được gửi từ phụ trợ, bạn sẽ có thể ánh xạ liền mạch các lớp Java thành các lớp TypeScript (JS).

Thực hiện

Tạo và đăng ký một nhà cung cấp codec với Cơ quan đăng ký mã Mongo mà Mongo sử dụng để xác định bộ giải mã enum nào để sử dụng giá trị enum java

public class ProcessTypeCodec extends AbstractCodec<ProcessType> {

    public ProcessTypeCodec() {
        super();
    }

    @Override
    public Class<ProcessType> getEncoderClass() {
        return ProcessType.class;
    }
}

Nhập chế độ FullScreenen EXIT Mode FullScreen

Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.

Với hướng dẫn dưới đây và việc sử dụng biến áp lớp để giải mã dữ liệu được gửi từ phụ trợ, bạn sẽ có thể ánh xạ liền mạch các lớp Java thành các lớp TypeScript (JS).

public enum ProcessType {
    CONVERT_ONE_TO_ONE("convert-one-to-one"),
    CONVERT_ONE_TO_MANY("convert-one-to-many");

    private String value;
    private static final Map<String, ProcessType> ENUM_MAP;
    static {
        Map<String, ProcessType> map = new HashMap<String, ProcessType>();
        for (ProcessType instance : ProcessType.values()) {
            map.put(instance.value(), instance);
        }
        ENUM_MAP = Collections.unmodifiableMap(map);
    }
    ProcessType(String type) {
        this.value = type;
    }

    public String value() {
        return this.value;
    }

    public static ProcessType fromValue(String value) {
        return ENUM_MAP.get(value);
    }

    /**
     * Used by the Mongo codec
     * 
     * @return
     */
    public static ProcessType getDefaultValue() {
        return CONVERT_ONE_TO_ONE;
    }

    /**
     * Required to properly convert Java Enum name to value.
     * Value is used by front-end and usually uses 
* 1. lowercase
* 2. dashes instead of underscores

*/
@Override public String toString() { return this.value; } }

Nhập chế độ FullScreenen EXIT Mode FullScreen

Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.

Với hướng dẫn dưới đây và việc sử dụng biến áp lớp để giải mã dữ liệu được gửi từ phụ trợ, bạn sẽ có thể ánh xạ liền mạch các lớp Java thành các lớp TypeScript (JS).

Thực hiện

export enum OutputExtension {
    MP4 = '.mp4',
    WEBM = '.webm'
}

Nhập chế độ FullScreenen EXIT Mode FullScreen

Nếu chúng tôi sử dụng bộ giải mã enum mặc định được cung cấp bởi Mongo Java Driver, thì các giá trị của chúng tôi phải giống như tên trên Java Enum, quá kết hợp và nghiêm ngặt để chúng tôi viết mã dễ đọc hơn.

public enum OutputExtension {
    MP4(".mp4"),
    WEBM(".webm")
    // ... rest of the code similar to above ProcessType Enum
}

Nhập chế độ FullScreenen EXIT Mode FullScreen

Với hướng dẫn dưới đây và việc sử dụng biến áp lớp để giải mã dữ liệu được gửi từ phụ trợ, bạn sẽ có thể ánh xạ liền mạch các lớp Java thành các lớp TypeScript (JS).
i.e.

Thực hiện

Nhập chế độ FullScreenen EXIT Mode FullScreen

Tạo và đăng ký một nhà cung cấp codec với Cơ quan đăng ký mã Mongo mà Mongo sử dụng để xác định bộ giải mã enum nào để sử dụng giá trị enum java

Chúng ta có thể lưu trữ enum trong MongoDB không?

Các bước: Tạo và đăng ký một nhà cung cấp Codec với Cơ quan đăng ký mã Mongo mà Mongo sử dụng để xác định bộ giải mã enum nào để sử dụng giá trị enum Java. Tạo và đăng ký Bộ giải mã Enum cho ProcessType. Tạo và đăng ký Enum với DB.Create and register a codec provider with Mongo Code Registry which Mongo uses to determine which Enum decoder to use a Java Enum value. Create and register Enum decoder for ProcessType. Create and register Enum with DB.

Các enum được lưu trữ trong cơ sở dữ liệu như thế nào?

Trước hết, để lưu các giá trị enum trong cơ sở dữ liệu quan hệ bằng JPA, bạn không phải làm bất cứ điều gì.Theo mặc định, khi một enum là một phần của một thực thể, JPA ánh xạ các giá trị của nó thành các số bằng phương thức Ordinal ().Điều đó có nghĩa là không có tùy chỉnh JPA lưu trữ giá trị enum dưới dạng số.JPA maps its values into numbers using the ordinal() method. What it means is that without customizations JPA stores enum value as numbers.

Enum trong lược đồ Mongoose là gì?

Mongoose có một số trình xác nhận sẵn có.Chuỗi có enum là một trong những trình xác nhận.Vì vậy, Enum tạo trình xác thực và kiểm tra xem giá trị được đưa ra trong một mảng.Ví dụ: const Userschema = New Mongoose.Schema ({userType: {type: String, enum: ['user', 'admin'], mặc định: 'user'},})creates a validator and checks if the value is given in an array. E.g: const userSchema = new mongoose. Schema({ userType: { type: String, enum : ['user','admin'], default: 'user' }, })

Việc sử dụng enum trong Mongoose là gì?

Chuỗi Mongoose và các loại số có Trình xác thực Enum.Trình xác nhận enum là một mảng sẽ kiểm tra xem giá trị được đưa ra có phải là một mục trong mảng không.Nếu giá trị không nằm trong mảng, Mongoose sẽ ném xác thực khi bạn cố gắng lưu ().an array that will check if the value given is an item in the array. If the value is not in the array, Mongoose will throw a ValidationError when you try to save() .