programing

다중 입력 - mongoosejs

nicescript 2023. 2. 11. 16:37
반응형

다중 입력 - mongoosejs

예를 들어 모형에 이중 참조가 있는 단순한 쿼리입니다.

스키마/모델

var OrderSchema = new Schema({

    user: {
        type    : Schema.Types.ObjectId,
        ref     : 'User',
        required: true
    },

    meal: {
        type    : Schema.Types.ObjectId,
        ref     : 'Meal',
        required: true
    },
});

var OrderModel = db.model('Order', OrderSchema);

쿼리

OrderModel.find()
    .populate('user') // works
    .populate('meal') // dont works
    .exec(function (err, results) {
         // callback
    });

제가 이미 해봤는데

.populate('user meal')
.populate(['user', 'meal'])

사실 인구 중 오직 한 명만이 효과가 있다.

그럼, 어떻게 두 개체군이 작동할까요?

다음 구문을 이미 올바르게 사용하고 있습니다.

OrderModel.find()
    .populate('user')
    .populate('meal')
    .exec(function (err, results) {
         // callback
    });

아마도meal주문의 ObjectId가 에 없습니다.Meals콜렉션?

갱신:
이 솔루션은 Mongoose 버전 3.x에서는 그대로입니다.
http://mongoosejs.com/docs/3.8.x/docs/populate.html
그러나 >= 4.x 버전의 Mongoose에 대해서는 더 이상 문서화되어 있지 않기 때문에 @Johnny의 답변이 있습니다.현재로선 HK만이 유효합니다.

오리지널 투고
Mongoose > = 3.6을 사용하는 경우 공백으로 구분된 경로 이름 문자열을 전달하여 다음을 채울 수 있습니다.

OrderModel.find()
    .populate('user meal')
    .exec(function (err, results) {
         // callback
    });

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

이것은 이미 해결되었을지도 모릅니다만, Mongodb > 3.6의 복수 인구에 대한 저의 견해는 다음과 같습니다.

OrderModel.find().populate([{
    path: 'user',
    model: 'User'
}, {
    path: 'meal',
    model: 'Meal'
}]).exec(function(err, order) {
    if(err) throw err;
    if(order) {
        // execute on order
        console.log(order.user.username); // prints user's username
        console.log(order.meal.value);    // you get the idea
    }
});

다른 방법도 있겠지만, 초보자(나처럼)에게는 매우 읽기 쉬운 코드가 됩니다.

내 생각에 가장 좋은 솔루션은 동일한 수준에서 여러 개의 외부 필드를 채울 때 배열입니다.내 코드에 따르면 여러 레벨의 모집단이 있습니다.

const patients = await Patient.find({})
                    .populate([{
                        path: 'files',
                        populate: {
                            path: 'authorizations',
                            model: 'Authorization'
                        },
                        populate: {
                            path: 'claims',
                            model: 'Claim',
                            options: {
                                sort: { startDate: 1 }
                            }
                        }
                    }, {
                        path: 'policies',
                        model: 'Policy',
                        populate: {
                            path: 'vobs',
                            populate: [{
                                path: 'benefits'
                            }, {
                                path: 'eligibility', 
                                model: 'Eligibility'
                            }]
                        }
                    }]);

보시다시피 문서의 여러 필드에 입력이 필요한 경우 배열에 입력 키를 넣고 개체 배열을 제공했습니다. 개체마다 경로가 다릅니다.가장 견고하고 간결한 방법이라고 생각합니다.

사용할 수 있습니다.array구문:

let results = await OrderModel.find().populate(['user', 'meal']);

각 채우기에서 원하는 속성을 선택할 수도 있습니다.

let results = await OrderModel.find().populate([{path: 'user', select: 'firstname'}, {path: 'meal', select: 'name'}]);

최신 mongoosev5.9.15에는 입력 필드의 배열을 취득할 수 있는 기능이 있기 때문에 다음과 같이 할 수 있습니다.

.populate([ 'field1', 'field2' ])

다음 작업을 수행할 수 있습니다.

OrderModel.find()
    .populate('user')
    .populate('meal')
    .exec(function (err, results) {
         // callback
    });

또는 어레이 옵션을 사용하여

OrderModel.find()
    .populate([
      {
        path: "path1",
        select: "field",
        model: Model1
      },
      {
        path: "path2",
        select: "field2",
        model: Model2
      }
    ])
    .exec(function (err, results) {
         // callback
    });

모델 파일에서 다음과 같은 작업을 수행합니다.

 doctorid:{
        type:Schema.Types.ObjectId, ref:'doctor'
        },
    clinicid:{
        type:Schema.Types.ObjectId, ref:'baseClinic'
        }

연산자를 추가하기 위한 js 파일에서 다음과 같은 것을 사용합니다.

 const clinicObj = await BaseClinic.findOne({clinicId:req.body.clinicid})
 const doctorObj = await Doctor.findOne({ doctorId : req.body.doctorid}) ;
**and add data as:-**
const newOperator = new Operator({
      clinicid:clinicObj._id,
      doctorid: doctorObj._id
    });

이제, 채우는 동안

apiRoutes.post("/operator-by-id", async (req, res) => {
    const id = req.body.id;
    const isExist = await Operator.find({ _id: id }).populate(['doctorid','clinicid'])
    if (isExist.length > 0) {
      res.send(isExist)
    } else {
      res.send("No operator found");
    }
  });

같은 문제를 안고 있지만 populate에 없는 나의 실수는 Model에 오류가 있다.

이렇게 하면

수정되어 있지 않다

user: {
 type: [Schema.Types.ObjectId],
 ref: 'User'
} 

맞아요.

user: [{
 type: Schema.Types.ObjectId,
 ref: 'User'
}]

이렇게 오브젝트 주위에 어레이를 배치해야 합니다.

컨트롤러/액션 함수의 객체 배열로 여러 필드를 채우려면 두 모델의 모델이 이미 게시 스키마에서 참조됩니다.

post.find({}).populate('user').populate('comments').exec(function (err,posts)
    {
    
    if(err)
    {
        console.log("error in post");
    }
    
        return  res.render('home',{
            h1:"home Page",
            posts:posts,
            
            });      
        });

생각에 당신은 공식 의사들을 방문할 수 있는 중첩된 사람들을 위해 노력하고 있는 것 같아요.

User.
  findOne({ name: 'Val' }).
  populate({
    path: 'friends',
    // Get friends of friends - populate the 'friends' array for every friend
    populate: { path: 'friends' }
  });

언급URL : https://stackoverflow.com/questions/12821596/multiple-populates-mongoosejs

반응형