Mengapa luwak selalu menambahkan s di akhir nama koleksi saya

120

Misalnya, kode ini menghasilkan koleksi yang disebut "data" yang dibuat

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

Dan kode ini menghasilkan koleksi yang disebut "pengguna"

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

Terima kasih

Bob Ren
sumber
3
Ini konvensi di Rails. Anda memiliki objek "pengguna", Anda menyimpannya di koleksi "pengguna". Itu sama di Mongoose, kurasa.
Sergio Tulentsev
Ya, yang cukup menarik adalah var Dataset = mongoose.model ('dataset', dataSchema); menghasilkan koleksi yang disebut data.
Bob Ren
Tampaknya logika pluralisasi tidak sebodoh itu (atau pintar, tergantung apa yang Anda harapkan). Saya yakin Anda dapat mengetahui cara kerjanya dengan tepat (temukan sumbernya).
Sergio Tulentsev
2
@SergioTulentsev, itu bukan ruby, tetapi bekerja dengan cara yang sama github.com/LearnBoost/mongoose/blob/master/lib/utils.js
7
Sekadar catatan. Data jamak, data tunggal adalah datum
Luis Sieira

Jawaban:

200

Mongoose mencoba menjadi pintar dengan membuat nama koleksi Anda jamak. Namun Anda dapat memaksanya menjadi apa pun yang Anda inginkan:

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

aaronheckmann
sumber
31
Saya tidak mengerti bagaimana menambahkan "s" membuat kerangka kerja lebih cerdas, IMHO, itu ide yang buruk. Selain itu luwak adalah kerangka kerja yang luar biasa.
Roberto
14
itu adalah pilihan buruk lama yang merusak kompatibilitas mundur jika diambil. jadi kami memilih untuk tetap menggunakannya.
aaronheckmann
18
itu tidak hanya menambahkan 's' tetapi membuat bentuk jamak yang benar dari namanya. Coba contoh dengan 'mouse', Anda akan mendapatkan koleksi bernama 'mice' atau dengan 'person' Anda akan mendapatkan 'people'. Sungguh membuat saya gila untuk memahami dari mana nama-nama ini berasal :-)
Enrico Giurin
3
Ini sangat gila sekarang, nama mana yang Anda gunakan untuk menanyakan koleksi Anda terutama ketika Anda harus melakukannya dari antarmuka lain?
Xsmael
8
Saya panik, karena saya mendefinisikan "kuas" dan ada koleksi bernama "kuas". Saya mencoba menemukan di mana saya mendefinisikannya selama hampir setengah jam dan tidak menemukan apa pun. Saya berpikir: "Mungkin pintar dan menambahkan itu. Mungkin tidak, tapi mari kita lihat .... FUUUUUUU"
Fusseldieb
49

Struktur API mongoose.model adalah ini:

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

Apa yang dilakukan luwak adalah, Ketika tidak ada argumen koleksi yang dilewatkan, Mongoose menghasilkan nama koleksi dengan membuat jamak nama model. Jika Anda tidak menyukai perilaku ini, berikan nama koleksi atau setel opsi nama koleksi skema Anda.

Contoh:

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

atau

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

atau

var collectionName = 'actor'
var M = mongoose.model('Actor', schema, collectionName);
Nishank Singla
sumber
30

Mulai dari mongoose 5.x Anda dapat menonaktifkannya sepenuhnya:

mongoose.pluralize(null);
Andrey Hohutkin
sumber
Solusi terbaik, karena kita tidak perlu menentukan nama model dan nama koleksi.
Nezih
Ini jelas merupakan pendekatan terbaik.
netishix
1
Saya butuh beberapa jam untuk mempelajari kecerdasan luwak semacam ini. Pokoknya - senang saya menemukan solusi ini. BTW: Ini juga menghindari casing bawah otomatis dari nama koleksi.
Bernhard Fürst
8

Anda cukup menambahkan string sebagai argumen ketiga untuk menentukan nama sebenarnya dari koleksi tersebut. Memperluas contoh Anda, untuk mempertahankan nama sebagai datadan usermasing - masing:

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

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

Anda dapat menambahkan nama koleksi sebagai parameter ketiga. Lihat contoh menggunakan Ketikan:

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;
sebu
sumber
2
//Mongoose's definition file. NOT your model files
1 const mongoose = require("mongoose");
2 mongoose.pluralize(null);

Menambahkan garismongoose.pluralize(null) di file Mongoose Anda akan mencegah pluralisasi nama koleksi. Anda tidak perlu menambahkan baris ini ke file model Anda.

Seperti yang terlihat di sini .

Daniel Segura
sumber
1

Di akhir pendefinisian skema Anda di baris berikutnya Gunakan kode ini

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

Asumsikan bahwa status Anda adalah apa yang ingin Anda gunakan pada db Anda untuk menghindari s sebagai status

Klik link untuk melihat gambar dengan benar

Pedro JR
sumber
-2

Mongoose menyusun model untuk Anda ketika Anda menjalankan perintah ini

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

Argumen pertama adalah nama tunggal koleksi model Anda. Mongoose secara otomatis mencari bentuk jamak, versi huruf kecil dari nama model Anda. Jadi, untuk contoh di atas, model anak adalah untuk koleksi anak di database.

Catatan: The .model()fungsi membuat salinan skema. Pastikan Anda telah menambahkan semua yang ingin Anda skema, termasuk hook, sebelum menelepon .model()!

Kushagra
sumber
Anda menciptakan kembali masalahnya?
Pedro JR