ID가 아닌 필드로 mongoose 모델 채우기
몽구스 모델을 _id...가 아닌 참조 모델의 필드(예: 사용자 이름)로 채울 수 있습니까?
그러니까 뭐 그런 거.
var personSchema = Schema({
_id : Number,
name : String,
age : Number,
stories : { type: String, field: "username", ref: 'Story' }
});
이는 Mongoose 4.5 이후에 지원되며 가상 개체군이라고 합니다.
스키마 정의 후 모델을 생성하기 전에 다음과 같이 외부 키 관계를 정의해야 합니다.
// Schema definitions
BookSchema = new mongoose.Schema({
...,
title: String,
authorId: Number,
...
},
// schema options: Don't forget this option
// if you declare foreign keys for this schema afterwards.
{
toObject: {virtuals:true},
// use if your results might be retrieved as JSON
// see http://stackoverflow.com/q/13133911/488666
//toJSON: {virtuals:true}
});
PersonSchema = new mongoose.Schema({id: Number, ...});
// Foreign keys definitions
BookSchema.virtual('author', {
ref: 'Person',
localField: 'authorId',
foreignField: 'id',
justOne: true // for many-to-1 relationships
});
// Models creation
var Book = mongoose.model('Book', BookSchema);
var Person = mongoose.model('Person', PersonSchema);
// Querying
Book.find({...})
// if you use select() be sure to include the foreign key field !
.select({.... authorId ....})
// use the 'virtual population' name
.populate('author')
.exec(function(err, books) {...})
그들이 강제로 사용하는 것 같습니다._id
나중에 사용자 지정할 수도 있습니다.
Github https://github.com/LearnBoost/mongoose/issues/2562 에 대한 이슈입니다.
다음은 $lookup aggregate를 사용하여 해당 사용자를 기준으로 Invite라는 모델을 채우는 예입니다.email
필드:
Invite.aggregate(
{ $match: {interview: req.params.interview}},
{ $lookup: {from: 'users', localField: 'email', foreignField: 'email', as: 'user'} }
).exec( function (err, invites) {
if (err) {
next(err);
}
res.json(invites);
}
);
아마도 당신이 하려는 것과 상당히 비슷할 것입니다.
Frosty의 답변에 덧붙여, 만약 당신이 다른 컬렉션의 문서들을 참조하고 싶다면, 당신은 그렇게 변경할 것입니다.
BookSchema = new mongoose.Schema(
{
title: String,
authorId: [Number],
},
// schema options: Don't forget this option
// if you declare foreign keys for this schema afterwards.
{
toObject: { virtuals: true },
// use if your results might be retrieved as JSON
// see http://stackoverflow.com/q/13133911/488666
toJSON: {virtuals:true}
});
PersonSchema = new mongoose.Schema({ id: Number, name: String });
BookSchema.virtual("author", {
ref: "Person",
localField: ["authorId"],
foreignField: ["id"],
// justOne: true, // Needs to be commented out in this scenario,
});
다음을 사용할 수 있습니다.populate()
API. API가 더 유연하므로 지정할 필요가 없습니다.ref
그리고.field
스키마에 있습니다.
http://mongoosejs.com/docs/api.html#document_Document-populate http://mongoosejs.com/docs/api.html#model_Model.populate
다양하게 조합할 수 있습니다.find()
.
언급URL : https://stackoverflow.com/questions/19287142/populate-a-mongoose-model-with-a-field-that-isnt-an-id
'programing' 카테고리의 다른 글
Vue, fetch에서 빈 배열을 반환합니다. (0) | 2023.06.23 |
---|---|
org.springframework.cloud:spring-cloud-starter-netflix-eureka-client:unknown (0) | 2023.06.23 |
제품 변형 가격 보기 테이블 쿼리 (0) | 2023.06.23 |
동적 SQL을 실행하는 Oracle PL/SQL 익명 블록에서 결과 집합/커서를 반환하는 방법은 무엇입니까? (0) | 2023.06.23 |
서블릿 컨테이너가 내장되지 않은 스프링 부트 (0) | 2023.06.23 |