몽구스는 왜 항상 내 컬렉션 이름 끝에 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.