programing

Mongoose에서 다른 스키마 참조

closeapi 2023. 3. 12. 10:49
반응형

Mongoose에서 다른 스키마 참조

다음과 같은 스키마가 2개 있는 경우:

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    displayName: String,
    profilePic: String,
});

var  User = mongoose.model('User') 

var postSchema = new Schema({
    name: String,
    postedBy: User,  //User Model Type
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

위의 예시와 같이 연결하려고 했지만 방법을 알 수 없었습니다.결국 내가 이런 일을 할 수 있다면 내 삶은 매우 편안해질 것이다.

var profilePic = Post.postedBy.profilePic

당신이 찾고 있는 것은 입력 방법인 것 같습니다.먼저 포스트 스키마를 약간 변경합니다.

var postSchema = new Schema({
    name: String,
    postedBy: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

그런 다음 모델을 만듭니다.

var Post = mongoose.model('Post', postSchema);

그런 다음 쿼리를 작성할 때 다음과 같이 참조를 채울 수 있습니다.

Post.findOne({_id: 123})
.populate('postedBy')
.exec(function(err, post) {
    // do stuff with post
});

부록:아무도 "인포메이션"에 대해 언급하지 않았습니다.- Mongooses인포메이션 방법을 보면 시간과 비용이 많이 듭니다: 또한 참조하는 교차 문서를 설명합니다.

http://mongoosejs.com/docs/populate.html

답변이 늦었지만, Mongoose가 Subdocuments의 개념도 가지고 있다고 덧붙였습니다.

이 구문을 사용하면 다음 구문을 참조할 수 있습니다.userSchema의 유형으로서postSchema다음과 같이 합니다.

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    displayName: String,
    profilePic: String,
});

var postSchema = new Schema({
    name: String,
    postedBy: userSchema,
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

업데이트된 내용을 메모합니다.postedBy활자가 있는 필드userSchema.

그러면 게시물에 사용자 개체가 포함되어 참조를 사용하여 필요한 추가 조회가 저장됩니다.경우에 따라서는 이것이 바람직할 수도 있고, 경우에 따라서는 ref/pulate 루트가 권장될 수도 있습니다.애플리케이션의 동작에 따라 다릅니다.

이것은 D에 더해집니다.로우의 대답은 나에게 효과가 있었지만 약간의 수정이 필요했다.(댓글을 달았으면 좋았을 텐데, 평판이 좋지 않고, 몇 달 후에 다시 이 문제에 직면했을 때 이 정보를 보고 싶은데 어떻게 해결해야 할지 잊어버렸습니다.)

다른 파일에서 스키마를 Import할 경우 Import 끝에 .schema를 추가해야 합니다.

주의: 스키마를 Import하지 않고 로컬 스키마를 사용하는 대신 Import가 더 깔끔하고 다루기 쉬운 경우 [Invalid schema]설정이 표시되는지 잘 모르겠습니다.

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

// ./models/other.js
const mongoose = require('mongoose')

const otherSchema = new mongoose.Schema({
    content:String,
})

module.exports = mongoose.model('Other', otherSchema)

//*******************SEPERATE FILES*************************//

// ./models/master.js
const mongoose = require('mongoose')

//You will get the error "Invalid schema configuration: `model` is not a valid type" if you omit .schema at the end of the import
const Other=require('./other').schema


const masterSchema = new mongoose.Schema({
    others:[Other],
    singleOther:Other,
    otherInObjectArray:[{
        count:Number,
        other:Other,
    }],
})

module.exports = mongoose.model('Master', masterSchema);

그 후, 이것을 사용하는 장소(내 Node.js API에서 이와 유사한 코드를 사용)에 관계없이 마스터에 다른 코드를 할당할 수 있습니다.

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

const Master= require('../models/master')
const Other=require('../models/other')

router.get('/generate-new-master', async (req, res)=>{
    //load all others
    const others=await Other.find()

    //generate a new master from your others
    const master=new Master({
        others,
        singleOther:others[0],
        otherInObjectArray:[
            {
                count:1,
                other:others[1],
            },
            {
                count:5,
                other:others[5],            
            },
        ],
    })

    await master.save()
    res.json(master)
})
{body: "string", by: mongoose.Schema.Types.ObjectId}

mongoose.Schema.Types.ObjectId새로운 ID가 생성됩니다.문자열이나 숫자와 같은 보다 직접적인 타입으로 변경해 주세요.

언급URL : https://stackoverflow.com/questions/18001478/referencing-another-schema-in-mongoose

반응형