Настроить модель мангуста с полем, который не является идентификатором
Можно ли заполнить модель мангуста полем эталонной модели, которая не является _id... например. имя пользователя.
так что-то вроде
var personSchema = Schema({
_id : Number,
name : String,
age : Number,
stories : { type: String, field: "username", ref: 'Story' }
});
Ответы
Ответ 1
Вы можете использовать API populate()
.
API более гибкий, вам не нужно указывать ref
и field
в схеме.
http://mongoosejs.com/docs/api.html#document_Document-populate
http://mongoosejs.com/docs/api.html#model_Model.populate
Вы можете смешивать и сопоставлять с find()
.
Ответ 2
Это поддерживается с Mongoose 4.5 и называется совокупность виртуальных сетей.
Вы должны определить внешние ключи после определений схем и до создания моделей, например:
// Schema definitions
BookSchema = new mongoose.Schema({
...,
title: String,
author_id: 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: 'author_id',
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({.... author_id ....})
// use the 'virtual population' name
.populate('author')
.exec(function(err, books) {...})
Ответ 3
Кажется, они применяют для использования _id
, и, возможно, мы можем настроить его в будущем.
Вот проблема Github https://github.com/LearnBoost/mongoose/issues/2562
Ответ 4
Это пример использования агрегирования $lookup для заполнения модели с именем 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);
}
);
Вероятно, это похоже на то, что вы пытаетесь сделать.