programing

Mongoose 'static' 메서드 대 'instance' 메서드

newnotes 2023. 3. 16. 21:49
반응형

Mongoose 'static' 메서드 대 'instance' 메서드

이 질문은 이것과 비슷하지만 용어가 다르다고 생각합니다.Mongoose 4 매뉴얼:

독자적인 커스텀 문서 인스턴스 메서드를 정의할 수도 있습니다.

// define a schema
var animalSchema = new Schema({ name: String, type: String });

// assign a function to the "methods" object of our animalSchema
animalSchema.methods.findSimilarTypes = function (cb) {
  return this.model('Animal').find({ type: this.type }, cb);
}

현재 모든 동물 인스턴스에서 findSimilarTypes 메서드를 사용할 수 있습니다.

그 후:

정적 메서드를 모델에 추가하는 것도 간단합니다.animal Schema 계속:

// assign a function to the "statics" object of our animalSchema
animalSchema.statics.findByName = function (name, cb) {
  return this.find({ name: new RegExp(name, 'i') }, cb);
}

var Animal = mongoose.model('Animal', animalSchema);
Animal.findByName('fido', function (err, animals) {
  console.log(animals);
});

정적 방법으로는 각각의 동물 인스턴스가findByName사용할 수 있는 방법도 있습니다.□□□□□□가 뭐예요?statics ★★★★★★★★★★★★★★★★★」methods 은 무엇 때문에 ?차이점은 무엇이며, 왜 하나를 다른 하나와 겹쳐서 사용해야 합니까?

statics이치노 methods는 문서(필수)에 정의되어 있습니다.

다음과 같은 정적 방법을 사용할 수 있습니다.Animal.findByName:

const fido = await Animal.findByName('fido');
// fido => { name: 'fido', type: 'dog' }

또한 다음과 같은 인스턴스 방법을 사용할 수 있습니다.fido.findSimilarTypes:

const dogs = await fido.findSimilarTypes();
// dogs => [ {name:'fido',type:'dog} , {name:'sheeba',type:'dog'} ]

당신은 않을 Animals.findSimilarTypes()동물은 모델이기 때문에 "유형"이 없습니다. findSimilarTypesthis.type이 속성은 Animals 모델에는 존재하지 않으며 문서 인스턴스만 모델에 정의된 대로 해당 속성을 포함합니다.

로, 여러분은 fido.findByNamefindByName.fido그냥 문서일 뿐이에요

§ 기술적으로는 가능합니다.인스턴스는 this.constructor컬렉션에 액세스할 수 있기 때문입니다(또는this.model('Animal')(적어도 이 경우) 인스턴스의 속성을 사용하지 않는 인스턴스 메서드는 의미가 없습니다.(이 점을 지적해 주신 @AaronDufour님 덕분입니다)

데이터베이스 로직은 데이터 모델 내에 캡슐화되어야 합니다.Mongoose는 이것을 하는 두 가지 방법, 방법과 정적인 방법을 제공한다.메서드는 문서에 인스턴스 메서드를 추가하는 반면 Statics는 모델 자체에 정적 "클래스" 메서드를 추가합니다.static 키워드는 모델의 스태틱 방식을 정의합니다.모델의 인스턴스에서는 정적 메서드가 호출되지 않습니다.대신 모델 자체에서 호출됩니다.이러한 기능은 종종 개체를 만들거나 복제하는 기능과 같은 유틸리티 기능입니다.다음 예시와 같습니다.

const bookSchema = mongoose.Schema({
  title: {
    type : String,
    required : [true, 'Book name required']
  },
  publisher : {
    type : String,
    required : [true, 'Publisher name required']
  },
  thumbnail : {
    type : String
  }
  type : {
    type : String
  },
  hasAward : {
    type : Boolean
  }
});

//method
bookSchema.methods.findByType = function (callback) {
  return this.model('Book').find({ type: this.type }, callback);
};

// statics
bookSchema.statics.findBooksWithAward = function (callback) {
  Book.find({ hasAward: true }, callback);
};

const Book = mongoose.model('Book', bookSchema);
export default Book;

상세한 것에 대하여는, https://osmangoni.info/posts/separating-methods-schema-statics-mongoose/ 를 참조해 주세요.

글쎄요, 제가 보기엔 'static' 키워드 앞이나 심지어 'instance' 키워드 앞에 Mongoose를 추가하는 것은 아무것도 추가하지 않습니다.

제가 생각하는 스태틱의 의미와 목적은 어디에서나 같습니다.외계 언어나 다른 객체 지향 프로그래밍처럼 블록을 구축하기 위한 모델을 나타내는 드라이버도 마찬가지입니다.예를 들어, 같은 것도 마찬가지입니다.

Wikipedia에서:객체 지향 프로그래밍(OOP)의 방법은 메시지 및 객체와 관련된 절차입니다.개체는 데이터와 동작으로 구성됩니다.데이터와 동작은 인터페이스를 구성하며, 이 인터페이스를 통해 개체의 다양한 소비자[1]가 개체를 어떻게 사용할 수 있는지 지정합니다.

데이터는 객체의 속성으로 표현되며 동작은 객체의 메서드로 표현됩니다.예를 들어 Window 객체는 열림 및 닫힘 등의 메서드를 가지며 상태(특정 시점에서 열림 또는 닫힘)는 속성이 됩니다.

스태틱 메서드는 특정 인스턴스가 아닌 클래스의 모든 인스턴스와 관련된 것을 의미합니다.그런 의미에서 정적 변수와 유사합니다.예를 들어 클래스의 모든 인스턴스의 모든 변수 값을 합산하는 정적 메서드가 있습니다.예를 들어 제품 클래스가 있는 경우 모든 제품의 평균 가격을 계산하는 정적 방법을 사용할 수 있습니다.

Math.max(더블 a,더블 b)

이 정적 메서드는 소유 개체가 없으며 인스턴스에서 실행되지 않습니다.인수로부터 모든 정보를 수신합니다.[7]

클래스의 인스턴스가 아직 없는 경우에도 정적 메서드를 호출할 수 있습니다.정적 메서드는 호출된 클래스에 기반하여 컴파일 시에 해결되며 객체의 런타임 유형에 따라 동적으로 해결되는 인스턴스 메서드의 경우처럼 동적으로 해결되지 않기 때문에 "static"이라고 불립니다.

https://en.wikipedia.org/wiki/Method_(computer_programming)

모두가 말했듯이 하나의 문서에서 작업하고 싶을 때는 방법을 사용하고 전체 컬렉션에서 작업하고 싶을 때는 통계학을 사용합니다.하지만 왜 그랬을까?

예를 들어 스키마가 있다고 합시다.

var AnimalSchema = new Schema({
  name: String,
  type: String
});

문서에서 설명한 바와 같이 DB에서 유사한 유형의 특정 문서를 체크해야 할 경우 다음을 수행할 수 있습니다.

AnimalSchema.methods.findSimilarType = function findSimilarType (cb) {
    return this.model('Animal').find({ type: this.type }, cb);
};

이것은 문서 자체를 나타냅니다.즉, 이 문서에서는 모델이 어떤 모델에 속하는지 알 수 없습니다.기본적으로 메서드는 모델과는 관계가 없기 때문에 특정 문서 obj에만 해당됩니다.그러나 이.model('anyModelName')을 사용하여 모델을 사용할 수 있습니다.

왜 우리는 비슷한 종류의 동물을 찾는 방법을 사용했을까요?

비슷한 종류의 동물을 찾기 위해서는 우리는 비슷한 종류의 동물을 찾을 수 있는 동물성 오비를 가지고 있어야 한다.우리가 가지고 있는 그 동물 OBJ는 다음과 같습니다.

const Lion = await new Animal({name: Lion, type: "dangerous"});

다음으로 비슷한 타입이 발견되면 먼저 Lion obj가 필요합니다.즉, 특정 obj/문서의 도움이 필요할 때마다 방법을 사용합니다.

여기서 우연히도 모델 전체를 검색하여 슬림한 타입을 검색해야 합니다., 메서드에서는 직접 사용할 수 없습니다(modelName은 정의되지 않은 상태로 반환됩니다).이.model()을 우리가 선호하는 모델(이 경우 Animal)로 설정하면 얻을 수 있습니다.방법은 여기까지입니다.

이제, 스태틱스는 전체 모델을 자유롭게 사용할 수 있습니다.1) statics를 사용하는 모든 동물의 합계 가격(모델에 가격 필드가 있다고 가정)을 계산한다고 합시다(특정 Animal obj가 필요 없기 때문에 방법을 사용하지 않습니다) 2.피부가 노란 동물을 찾으려면(모형에 피부 필드가 있다고 가정하면), 정역학을 사용합니다.[특별히 동물 obj는 필요없기 때문에 방법을 사용하지 않습니다]

예:

 AnimalSchema.statics.findYellowSkin = function findSimilarType (cb) {
        return this.find({ skin: "yellow" }, cb);
    };

메서드에서는 모델을 참조하기 때문에 this.modelName은 Animal( 경우)을 반환합니다.

그러나 방법과 마찬가지로 모델을 설정할 수도 있습니다(단, 설정할 필요는 없습니다).

AnimalSchema.methods.findSimilarType = function findSimilarType (cb) {
    return this.model('Animal').find({ skin: "yellow" }, cb);   //just like in methods
};

보시다시피 두 가지 통계학 및 방법은 모두 매우 유사합니다.

문서가 있고 관련 사항이 필요할 때마다 방법을 사용하십시오.전체 모형/컬렉션에 대해 작업을 수행해야 할 때는 항상 통계학을 사용하십시오.

Static methods정의되어 있는 전체 모델에 적용되는 반면,instance methods컬렉션 내의 특정 문서에만 적용됩니다.

this정적 방법의 맥락에서 전체 모델을 반환합니다.this인스턴스 메서드의 컨텍스트에서 문서를 반환합니다.

예를 들어 다음과 같습니다.

const pokemon = new mongoose.Schema({})
pokemon.statics.getAllWithType = function(type){
      // Query the entire model and look for pokemon
      // with the same type
      // this.find({type : type})
}

pokemon.methods.sayName = function(){
      // Say the name of a specific pokemon
      // console.log(this.name)
}


const pokemonModel = mongoose.model('schema', pokemon)
const squirtle = new pokemonModel({name : "squirtle"})

// Get all water type pokemon from the model [static method]
pokemonModel.getAllWithType("water")

// Make squirtle say its name [instance method] 
squirtle.sayName()
  • .statics★★★★★★에static★★★★★★★★★★★★★★★★★★.
  • .methods★★★★★★에instance★★★★★★★★★★★★★★★★★★.
//instance method
bookSchema.methods.findByType = function (callback) {
  return this.model('Book').find({ type: this.type }, callback);
};

// static method
bookSchema.statics.findBooksWithAward = function (callback) {
  Book.find({ hasAward: true }, callback);
};

staticsmethods그러나 모델에 직접 존재하는 함수를 정의할 수 있습니다.

statics모델에 속하며methods인스턴스에 속함

언급URL : https://stackoverflow.com/questions/29664499/mongoose-static-methods-vs-instance-methods

반응형