Search code examples
mongodbmongoosemongoose-schema

Can database references in mongodb reference two databases?


I am using MongoDB via mongooose. Can database references reference two databases at the same time?

field_name: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'collectionA',// can I reference collectionA and collectionB too?
    required: true,
},

See code above.

The field, field_name, can be an objectId from collectionA or collectionB. How can I reflect that in my mongoose schema?


Solution

  • I guess you are looking for mongoose dynamic reference via refPath.

    const someSchema = new Schema({
      field_name: {
        type: Schema.Types.ObjectId,
        required: true,
        refPath: 'onCollection'
      },
      onCollection: {
        type: String,
        required: true,
        enum: ['collectionA', 'collectionB']
      }
    });
    

    In this case, Instead of a hardcoded model name in ref, refPath means Mongoose will look at the onCollection property to find the right model. For example if we have this document:

     {
       field_name: some_id,
       onCollection: 'collectionA'
     }
    

    Collection.find().populate('field_name') will populate the field from collectionA. And if the onCollection field was valued with collectionB, it would have populated it from collectionB.

    This scenario only works if you want to reference one collection at a time, but the collection is dynamic.


    If you need to reference both collections at the same time, there is no mongoose schema design to support array of references as far as I know.

    You can just ignore ref in your schema, and pass in the value of ref when you want to populate:

    populate({
      path: 'field_name',
      model: 'collectionA'   
    })
    

    Then you can have multiple populates. Same applies for $lookup.