몽구스의 가상

가상이란 무엇입니까?



문서에서 호출할 수 있는 특정 속성을 갖고 싶지만 이러한 속성을 데이터베이스에 저장하고 싶지 않을 수 있습니다.
이러한 속성의 예는 다음과 같은 속성입니다.
  • 사용자의 전체 이름을 가져옵니다.
  • 사용자의 댓글 배열에서 댓글 수를 가져옵니다.

  • 이러한 속성은 일반적으로 문서를 만들 때 필요하지 않지만 문서에서 수행되는 일종의 처리 결과로 발생합니다.
    mongoose 문서에 명시된 대로 가상은 가져오고 설정할 수 있지만 MongoDB에 유지되지 않는 문서 속성입니다.
    우리 자신의 가상을 만들어 봅시다. 몽구스의 쉬운 프로세스입니다.
    다음과 같은 사용자 모델이 있다고 가정합니다.

    const userSchema = new mongoose.Schema({
        firstname: {
            type: String,
            required: true
        },
        lastname: {
            type: String
        }
    })
    
    const User = mongoose.model('user', userSchema)
    


    사용자의 전체 이름(예: 이름 + 성)에 대한 액세스를 원합니다. 우리는 다음과 같이 할 수 있습니다.

    const user = await User.create({
         firstname: 'Godwin',
         lastname: 'Alexander'
    })
    
    console.log(`${user.firstname} ${user.lastname}`) 
    


    이것은 사용자의 전체 이름을 가져오는 것만큼 간단한 작업에 충분합니다. 실시간으로 10개 이상의 코드 라인이 필요한 데이터 모델에 대해 보다 정교한 처리를 수행해야 한다고 상상해 보십시오. 10줄 이상의 코드를 계속해서 작성해야 하는 것은 지루하고 번거롭지만 다행히도 탈출구가 있습니다. 다음과 같이 데이터 모델에서 가상을 선언하기만 하면 됩니다.

    userSchema.virtual('fullname')
    .get(function() {
        return `${this.firstname} ${this.lastname}`
    })
    


    이 논리는 이름과 성을 포함하는 문자열을 반환하는 fullname이라는 스키마에 가상 필드를 만듭니다.
    전체 이름 가상은 Mongodb에 저장되지 않고 런타임 중에 생성되어 모델에 연결됩니다.

    const user = await User.create({
            firstname: 'money',
            lastname: 'man'
        })
    console.log(`Welcome ${user.fullname}`) // money man
    


    위의 논리에서 알 수 있듯이 가상은 추상화에도 도움이 됩니다.

    Warning: Since virtuals aren't stored in mongodb, you can't query with them. Doing something like this will fail



    const users = await User.findOne({ fullname: 'Godwin Alexander' })
    


    가상의 get 메소드 외에도 set 메소드도 사용할 수 있습니다. Setter는 단일 값을 저장을 위해 여러 값으로 분해하는 데 유용합니다.
    다음 코드처럼 보이도록 userSchema를 업데이트한다고 가정합니다.

    const userSchema = new mongoose.Schema({
        firstname: {
            type: String,
            required: true
        },
        lastname: {
            type: String
        },
        initials: {
            type: String
        }
    })
    


    여기서 이니셜은 사용자 이름의 첫 글자와 성의 첫 글자로 구성된 단순한 문자열입니다. 물론 사용자에게 이니셜을 제공하도록 요청하고 싶지는 않습니다. Mongoose는 스키마에 지정되어 있는 한 이러한 값을 설정하는 방법을 제공합니다.

    userSchema.virtual('setInitials')
        .set(function(name) {
            const [first, last] = name.split(' ')
            this.initials = `${first[0]}${last[0]}`.toUpperCase()
        })
    


    이제 할 수 있습니다.

    const user = await User.create({
            firstname: 'mayweather',
            lastname: 'floyd'
        })
    
    user.setInitials = user.fullname
    console.log(user.initials) //MF
    


    이것이 이 튜토리얼의 전부입니다. 그러나 mongoose 문서는 mongoose 및 Mongodb로 수행할 수 있는 가상 및 기타 놀라운 작업에 대한 더 많은 통찰력을 제공할 수 있습니다. 다음 기사에서 뵙겠습니다.

    좋은 웹페이지 즐겨찾기