Firavun faresi koleksiyon adımın sonuna neden her zaman bir 'harfi ekliyor?


120

Örneğin, bu kod, "veriler" adlı bir koleksiyonun oluşturulmasına neden olur

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

Ve bu kod, "kullanıcılar" adlı bir koleksiyonun oluşturulmasıyla sonuçlanır

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

Teşekkürler


3
Rails'deki bir kuraldır. "Kullanıcı" nesneniz var, onu "kullanıcılar" koleksiyonunda depoluyorsunuz. Mongoose'da da aynı, sanırım.
Sergio Tulentsev

Evet, ilginç bir şekilde, yeterince var Dataset = mongoose.model ('datas', dataSchema); veriler adlı bir koleksiyonla sonuçlanır.
Bob Ren

Görünüşe göre çoğullaştırma mantığı o kadar aptalca değil (veya akıllıca, ne beklediğinize bağlı). Eminim tam olarak nasıl çalıştığını öğrenebilirsiniz (kaynağı bulun).
Sergio Tulentsev

2
@SergioTulentsev, bu Ruby değil, ancak aynı şekilde çalışıyor github.com/LearnBoost/mongoose/blob/master/lib/utils.js

7
Sadece kayıt için. Veriler çoğul, tekil veriler, verilerdir
Luis Sieira

Yanıtlar:


200

Mongoose koleksiyon adınızı çoğul hale getirerek akıllı olmaya çalışıyor. Ancak onu istediğiniz gibi olmaya zorlayabilirsiniz:

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


31
Bir "s" eklemenin çerçeveyi nasıl daha akıllı hale getirdiğini anlamıyorum, IMHO, bu kötü bir fikir. Bunun dışında firavun faresi harika bir çerçeve.
Roberto

14
bu, çıkarıldığında geriye dönük uyumluluğu bozan eski bir zayıf seçimdir. biz de buna bağlı kalmayı seçtik.
aaronheckmann

18
sadece bir 's' eklemekle kalmaz, aynı zamanda ismin doğru çoğulunu yapar. 'Fare' ile örnekler deneyin, 'fareler' adında bir koleksiyon elde edersiniz veya 'kişi' ile 'insan' alırsınız. Bu isimlerin nereden geldiğini anlamak beni çıldırtıyordu :-)
Enrico Giurin

3
Bu çok çılgınca, şimdi koleksiyonunuzu özellikle başka bir arayüzden yapmanız gerektiğinde sorgulamak için hangi adı kullanıyorsunuz?
Xsmael 01

8
Çıldırmıştım çünkü "fırçayı" tanımladım ve "fırçalar" adlı bir koleksiyon vardı. Bunu neredeyse yarım saattir nerede tanımladığımı bulmaya çalışıyordum ve hiçbir şey bulamadım. Düşündüm ki: "Belki akıllıdır ve bunu ekler. Muhtemelen hayır, ama hadi bakalım .... FUUUUUUU"
Fusseldieb

49

Mongoose.model'in API yapısı şudur:

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

Firavun faresinin yaptığı şey şudur: Koleksiyon bağımsız değişkeni iletilmediğinde, Mongoose model adını çoğullaştırarak bir koleksiyon adı üretir. Bu davranışı beğenmezseniz, bir koleksiyon adı verin veya şema koleksiyonu adı seçeneğini ayarlayın.

Misal:

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

veya

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

veya

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

30

Mongoose 5.x'ten başlayarak tamamen devre dışı bırakabilirsiniz:

mongoose.pluralize(null);

En iyi çözüm, çünkü hem model adını hem de koleksiyon adını tanımlamamız gerekmiyor.
Nezih

Bu kesinlikle en iyi yaklaşımdır.
netishix

1
Mongoose'un bu tür zarafetini öğrenmem birkaç saatimi aldı. Her neyse - bu çözümü bulduğuma sevindim. BTW: Aynı zamanda koleksiyon adlarının otomatik olarak alt kaplamasını önler.
Bernhard Fürst

8

Koleksiyonun gerçek adını tanımlamak için üçüncü argüman olarak bir dize ekleyebilirsiniz. Adları sırasıyla datave usersırasıyla tutmak için örneklerinizi genişletme :

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

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

2

Koleksiyon adını üçüncü parametre olarak ekleyebilirsiniz. Typescript kullanarak örneğe bakın:

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);

mongoose.pluralize(null)Mongoose dosyanıza satırı eklemek koleksiyon adının çoğullaşmasını önleyecektir. Bu satırı model dosyalarınıza eklemenize gerek yoktur.

Olarak görülüyor burada .



-2

Mongoose, bu komutu çalıştırdığınızda sizin için bir model derler

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

İlk argüman, modelinizin ait olduğu koleksiyonun tekil adıdır. Mongoose , model adınızın çoğul, küçük harfli sürümünü otomatik olarak arar . Bu nedenle, yukarıdaki örnek için, model alt, veritabanındaki çocuk koleksiyonu içindir.

Not:.model() Fonksiyon şemanın bir kopyasını oluşturur. Aramadan önce kancalar da dahil olmak üzere şema yapmak istediğiniz her şeyi eklediğinizden emin olun .model()!


sorunu yeniden mi yaratıyorsun?
Pedro JR
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.