Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongoDB: How to use one schema as sub-document for different collections defined in different files

I have this Schema:

var ParameterSchema = new Schema({
    id: {
        type: String,
        trim: true,
        default: ''
    },
    value: {
        type: String,
        trim: true,
        default: ''
    }
});

And I want to use it as sub-document, in two or more collections which are defined in different files like this:

File 1

var FirstCollectionSchema = new Schema({
    name: {
        type: String,
        trim: true,
        default: ''
    },
    parameters: [ParameterSchema]
});

File 2

var SecondCollectionSchema = new Schema({
    description: {
        type: String,
        trim: true,
        default: ''
    },
    parameters: [ParameterSchema]
});

so, the question is: How can I define ParameterSchema one time only, in another file, and use it from File 1 and from File 2.

like image 259
Ragnar Avatar asked Jun 09 '14 18:06

Ragnar


People also ask

How to add a sub-document to a collection in MongoDB?

Use the $push operator to add a sub-document. Let us first create a collection with documents − Following is the query to display all documents from a collection with the help of find () method − This will produce the following output −

Does MongoDB support multiple document references?

While MongoDB certainly supports references from one document to another, and even multi-document joins, it’s a mistake to use a document database the same way you use a relational one. For example, let’s look at a simple structure with a user, and their addresses.

What is a schema in MongoDB?

MongoDB also lets you enforce a schema to validate your data and maintain a data structure. We will use MongoDB Atlas and MongoDB Compass to demonstrate how.

What is embedded document in MongoDB?

Embedded documents are an efficient and clean way to store related data, especially data that’s regularly accessed together. In general, when designing schemas for MongoDB, you should prefer embedding by default, and use references and application-side or database-side joins only when they’re worthwhile.


1 Answers

Export the parameter sub-doc schema as a module.

// Parameter Model file 'Parameter.js'
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ParameterSchema = new Schema({
  id: {
    type: String,
    trim: true,
    default: ''
  },
  value: {
    type: String,
    trim: true,
    default: ''
  }
});

module.exports = ParameterSchema;
// Not as a mongoose model i.e. 
// module.exports = mongoose.model('Parameter', ParameterSchema);

Now require the exported module schema in your parent document.

// Require the model exported in the Parameter.js file
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Parameter = require('./Parameter');

var FirstCollectionSchema = new Schema({
  name: {
    type: String,
    trim: true,
    default: ' 
  },
  parameters: [Parameter]
});

module.exports = mongoose.model('FirstCollection', FirstCollectionSchema);

Now you save the collection and sub document.

var FirstCollection = require('./FirstCollection')

var feat = new FirstCollection({
  name: 'foo',
  parameters: [{
    id: 'bar',
    value: 'foobar'
  }]
});

feat.save(function(err) {
  console.log('Feature Saved');
})
like image 137
bizzurnzz Avatar answered Sep 20 '22 19:09

bizzurnzz