Populate a mongoose model with a field that isn't an id

前端 未结 4 616
时光说笑
时光说笑 2020-12-02 19:10

Is it possible to populate a mongoose model with a field of a reference model that isn\'t the _id ... e.g. a username.

so something like

var personSc         


        
相关标签:
4条回答
  • 2020-12-02 19:36

    You may use the populate() API. The API is more flexible, you don't have to specify ref and field in the Schema.

    http://mongoosejs.com/docs/api.html#document_Document-populate http://mongoosejs.com/docs/api.html#model_Model.populate

    You can mix and match with find().

    0 讨论(0)
  • 2020-12-02 19:36

    This is an example of using the $lookup aggregate to populate a model called Invite with the respective User based on the corresponding email field:

      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);
        }
      );
    

    It's probably quite similar to what you're trying to do.

    0 讨论(0)
  • 2020-12-02 19:45

    This is supported since Mongoose 4.5, and is called virtuals population.

    You have to define your foreign keys relationships after your schemas definitions and before creating models, like this:

    // 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) {...})
    
    0 讨论(0)
  • 2020-12-02 19:56

    It seems they enforce to use _id, and maybe we can customize it in the future.

    Here is the issue on Github https://github.com/LearnBoost/mongoose/issues/2562

    0 讨论(0)
提交回复
热议问题