I'm trying to do some relations between my schemas and I have some problems with my solution. Here is my device schema:
var deviceSchema = schema({
name : String,
type : String,
room: {type: mongoose.Types.ObjectId, ref: 'Room'},
users: [{type:mongoose.Types.ObjectId, ref: 'User'}]
});
and here room schema:
var roomSchema = schema({
name : String,
image : String,
devices: [{type: mongoose.Types.ObjectId, ref: 'Device'}]
});
Mongoose throws error
TypeError: Undefined type
ObjectID
atroom
Did you try nesting Schemas? You can only nest using refs or arrays.
If I change room: {type: mongoose.Types.ObjectId, ref: 'Room'},
to room: {type: Number, ref: 'Room'},
everything works. Could you explain me why this is happening?
An ObjectID is a 12-byte Field Of BSON type. The first 4 bytes representing the Unix Timestamp of the document. The next 3 bytes are the machine Id on which the MongoDB server is running. The next 2 bytes are of process id. The last Field is 3 bytes used for increment the objectid.
Schema. Types. ObjectId and that's means, it looks like a string of an ID when you get it back from the database but it's not, it's actually an object that converts it to a string.
The ref option is what tells Mongoose which model to use during population, in our case the Story model. All _id s we store here must be document _id s from the Story model. Note: ObjectId , Number , String , and Buffer are valid for use as refs.
Mongoose does not natively support long and double datatypes for example, although MongoDB does.
mongoose.Types.ObjectId
is the ObjectId
constructor function, what you want to use in schema definitions is mongoose.Schema.Types.ObjectId
(or mongoose.Schema.ObjectId
).
So deviceSchema
should look like this instead:
var deviceSchema = schema({
name : String,
type : String,
room: {type: mongoose.Schema.Types.ObjectId, ref: 'Room'},
users: [{type:mongoose.Schema.Types.ObjectId, ref: 'User'}]
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With