Tại sao mongoose luôn thêm một chữ s vào cuối tên bộ sưu tập của tôi


120

Ví dụ: mã này dẫn đến một bộ sưu tập có tên "dữ liệu" được tạo

var Dataset = mongoose.model('data', dataSchema);

Và mã này dẫn đến một tập hợp có tên "người dùng" được tạo

var User = mongoose.model('user', dataSchema);

Cảm ơn


3
Đó là quy ước trong Rails. Bạn có đối tượng "người dùng", bạn lưu trữ nó trong bộ sưu tập "người dùng". Tôi đoán là trong Mongoose cũng vậy.
Sergio Terrysev

Vâng, thú vị là var Dataset = mongoose.model ('datas', dataSchema); kết quả trong một tập hợp được gọi là dữ liệu.
Bob Ren

Có vẻ như logic đa nguyên hóa không phải là ngu ngốc (hay thông minh, tùy thuộc vào những gì bạn mong đợi). Tôi chắc rằng bạn có thể tìm ra cách nó hoạt động chính xác (tìm nguồn).
Sergio Terrysev

2
@SergioTishedsev, đó không phải là ruby, nhưng nó hoạt động theo cách tương tự github.com/LearnBoost/mongoose/blob/master/lib/utils.js

7
Chỉ để cho bản ghi âm thôi. Dữ liệu là số nhiều, số ít dữ liệu là dữ kiện
Luis Sieira

Câu trả lời:


200

Mongoose đang cố tỏ ra thông minh bằng cách đặt tên bộ sưu tập của bạn thành số nhiều. Tuy nhiên, bạn có thể buộc nó phải là bất cứ thứ gì bạn muốn:

var dataSchema = new Schema({..}, { collection: 'data' })


31
Tôi không hiểu bằng cách nào mà thêm một "s" làm cho khung thông minh hơn, IMHO, đó là một ý tưởng tồi. Ngoài mongoose đó là một khuôn khổ tuyệt vời.
Roberto

14
đó là một sự lựa chọn cũ kỹ kém khả năng tương thích ngược nếu bị loại bỏ. vì vậy chúng tôi đã chọn gắn bó với nó.
aaronheckmann

18
nó không chỉ thêm 's' mà còn tạo thành số nhiều chính xác của tên. Hãy thử các trường hợp với 'mouse', bạn sẽ nhận được một bộ sưu tập có tên là 'mouse' hoặc với 'person', bạn sẽ có được 'people'. Nó được lái xe cho tôi điên để hiểu từ nơi các tên này xuất phát từ :-)
Enrico Giurin

3
Điều này thật là điên rồ khi bạn sử dụng tên nào để truy vấn bộ sưu tập của mình một cách đặc biệt khi bạn phải làm điều đó từ một giao diện khác?
Xsmael

8
Tôi đang lăn tăn, vì tôi đã định nghĩa "brush" và có một bộ sưu tập tên là "brushes". Tôi đã cố gắng tìm nơi tôi đã xác định điều đó trong gần nửa giờ và không tìm thấy gì cả. Tôi nghĩ: "Có lẽ đó là thông minh và cho biết thêm rằng lẽ là không, nhưng chúng ta hãy se .... FUUUUUUU."
Fusseldieb

49

Cấu trúc API của mongoose.model là:

Mongoose#model(name, [schema], [collection], [skipInit])

Điều mà mongoose làm là, Khi không có đối số tập hợp nào được chuyển qua, Mongoose tạo ra một tên tập hợp bằng cách tổng hợp tên mô hình. Nếu bạn không thích hành vi này, hãy chuyển tên bộ sưu tập hoặc đặt tùy chọn tên bộ sưu tập lược đồ của bạn.

Thí dụ:

var schema = new Schema({ name: String }, { collection: 'actor' });

hoặc là

schema.set('collection', 'actor');

hoặc là

var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName);

30

Bắt đầu từ mongoose 5.x, bạn có thể tắt nó hoàn toàn:

mongoose.pluralize(null);

Giải pháp tốt nhất, vì chúng tôi không phải xác định cả tên mô hình và tên bộ sưu tập.
Nezih

Đây chắc chắn là cách tiếp cận tốt nhất.
netishix

1
Tôi đã mất vài giờ để tìm hiểu về loại thông minh này của Mongoose. Dù sao - rất vui vì tôi đã tìm thấy giải pháp này. BTW: Nó cũng tránh tự động viết hoa dưới tên bộ sưu tập.
Bernhard Fürst

8

Bạn có thể chỉ cần thêm một chuỗi làm đối số thứ ba để xác định tên thực cho tập hợp. Mở rộng các ví dụ của bạn, để giữ tên datausertương ứng:

var Dataset = mongoose.model('data', dataSchema, 'data');

var User = mongoose.model('user', dataSchema, 'user');

2

Bạn có thể thêm tên bộ sưu tập làm tham số thứ ba. Xem ví dụ bằng cách sử dụng Typescript:

import DataAccess = require('../DataAccess');
import IUser = require("../../Models/Interfaces/IUser");

var mongoose = DataAccess.mongooseInstance;
var mongooseConnection = DataAccess.mongooseConnection;

class UserSchema {
        static get schema () {
        var schema =  mongoose.Schema({
            _id : {
                type: String
            },
            Name: {
                type: String,
                required: true
            },
            Age: {
                type: Number,
                required: true
            }
        });

        return schema;
    }
}
var schema:any = mongooseConnection.model<IUser>("User", 
UserSchema.schema,"User");
export = schema;

2
//Mongoose's definition file. NOT your model files
1 const mongoose = require("mongoose");
2 mongoose.pluralize(null);

Thêm dòng mongoose.pluralize(null)trong tệp Mongoose của bạn sẽ ngăn chặn việc đa năng hóa tên bộ sưu tập. Bạn không cần thêm dòng này vào tệp mô hình của mình.

Như đã thấy ở đây .


1

Ở cuối xác định lược đồ của bạn trên dòng tiếp theo Sử dụng mã này

module.exports = mongoose.model("State", "StateSchema", "state")

Giả sử rằng trạng thái của bạn là những gì bạn muốn sử dụng trên db của mình để tránh các trạng thái

Nhấp vào liên kết để xem hình ảnh đúng cách


-2

Mongoose biên dịch một mô hình cho bạn khi bạn chạy lệnh này

var schema = new mongoose.Schema({ name: 'string', size: 'string' });
var child = mongoose.model('child', schema);

Đối số đầu tiên là tên riêng của bộ sưu tập mà mô hình của bạn sử dụng. Mongoose tự động tìm kiếm phiên bản số nhiều, viết thường của tên kiểu máy của bạn. Do đó, với ví dụ trên, model con là tập hợp con trong cơ sở dữ liệu.

Lưu ý: Các .model()chức năng tạo một bản sao của giản đồ. Đảm bảo rằng bạn đã thêm mọi thứ bạn muốn vào lược đồ, bao gồm cả hook, trước khi gọi .model()!


bạn đang tạo lại vấn đề?
Pedro JR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.