몽구스는 왜 항상 내 컬렉션 이름 끝에 s를 추가합니까?


120

예를 들어,이 코드는 "datas"라는 컬렉션을 생성합니다.

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

그리고이 코드는 "users"라는 컬렉션을 생성합니다.

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

감사


3
Rails의 관습입니다. "user"개체가 ​​있고 "users"컬렉션에 저장합니다. 몽구스에서도 마찬가지입니다.
Sergio Tulentsev

예, 흥미롭게도 충분히 var Dataset = mongoose.model ( 'datas', dataSchema); 데이터라는 컬렉션이 생성됩니다.
Bob Ren

복수형 논리는 그다지 멍청하지 않은 것 같습니다 (또는 똑똑한 것은 예상 한 것에 달려 있습니다). 정확히 어떻게 작동하는지 알 수 있다고 확신합니다 (소스 찾기).
Sergio Tulentsev

2
@SergioTulentsev, 그것은 루비가 아니지만 같은 방식으로 작동합니다. github.com/LearnBoost/mongoose/blob/master/lib/utils.js

7
기록만을 위해서. 데이터는 데이터의 유일한 자료이며, 복수입니다
루이스 Sieira

답변:


200

몽구스는 컬렉션 이름을 복수로 만들어 똑똑해 지려고합니다. 그러나 원하는대로 강제 할 수 있습니다.

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


31
"s"를 추가하면 프레임 워크를 더 지능적으로 만드는 방법을 이해할 수 없습니다. IMHO는 나쁜 생각입니다. 몽구스를 제외하고는 멋진 프레임 워크입니다.
Roberto

14
제거하면 이전 버전과의 호환성을 깨뜨리는 오래된 잘못된 선택입니다. 그래서 우리는 그것을 고수하기로 선택했습니다.
aaronheckmann 2013

18
's'를 추가하는 것이 아니라 올바른 복수형 이름을 만듭니다. 'mouse'로 인스턴스를 시도하면 'mice'라는 이름의 컬렉션을 얻거나 'person'으로 'people'을 얻을 수 있습니다. 이 이름은 :-) 어디에서 왔고은 이해하기 나를 미치게되었다
엔리코 Giurin

3
다른 인터페이스에서 수행해야 할 때 특히 컬렉션을 쿼리하는 데 어떤 이름을 사용합니까?
Xsmael

8
"브러시"를 정의하고 "브러시"라는 컬렉션이 있었기 때문에 나는 놀랐습니다. 나는 거의 30 분 동안 그것을 정의한 곳을 찾으려고했지만 아무것도 찾지 못했습니다. 나는 생각했다 : "어쩌면 그것은 똑똑하고 추가 아마도,하지만의 자체 .... FUUUUUUU을하지."
Fusseldieb

49

mongoose.model의 API 구조는 다음과 같습니다.

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

mongoose는 컬렉션 인수가 전달되지 않으면 Mongoose는 모델 이름을 복수화하여 컬렉션 이름을 생성합니다. 이 동작이 마음에 들지 않으면 컬렉션 이름을 전달하거나 스키마 컬렉션 이름 옵션을 설정하십시오.

예:

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

또는

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

또는

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

30

mongoose 5.x부터 완전히 비활성화 할 수 있습니다.

mongoose.pluralize(null);

최상의 솔루션은 모델 이름과 컬렉션 이름을 모두 정의 할 필요가 없기 때문입니다.
Nezih

이것은 확실히 최선의 접근 방식입니다.
netishix

1
몽구스의 이런 종류의 똑똑함에 대해 배우는 데 몇 시간이 걸렸습니다. 어쨌든-이 솔루션을 찾았다는 것이 기쁩니다. BTW : 또한 컬렉션 이름의 자동 소문자를 방지합니다.
Bernhard Fürst

8

세 번째 인수로 문자열을 추가하여 컬렉션의 실제 이름을 정의 할 수 있습니다. 같은 이름을 유지하기 위해, 귀하의 예를 확장 data하고 user각각 :

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

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

2

컬렉션 이름을 세 번째 매개 변수로 추가 할 수 있습니다. 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);

mongoose.pluralize(null)Mongoose 파일에 줄 을 추가하면 컬렉션 이름이 복수화되지 않습니다. 이 줄을 모델 파일에 추가 할 필요가 없습니다.

여기에서 볼 수 있습니다 .



-2

Mongoose는이 명령을 실행할 때 모델을 컴파일합니다.

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

첫 번째 인수는 모델이 대상인 컬렉션의 단일 이름입니다. Mongoose는 모델 이름 의 복수형 소문자 버전을 자동으로 찾습니다 . 따라서 위의 예에서 모델 하위는 데이터베이스의 하위 컬렉션에 대한 것입니다.

참고 :.model()함수는 스키마의 복사본을 만듭니다. 호출하기 전에 후크를 포함하여 스키마에 원하는 모든 것을 추가했는지 확인하십시오 .model().


문제를 재현하고 있습니까?
Pedro JR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.