Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongoose schema reference and undefined type 'ObjectID'

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 at room 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?

like image 203
niba Avatar asked Feb 19 '15 21:02

niba


People also ask

What is ObjectId in mongoose?

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.

What does schema types ObjectId mean?

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.

What does REF mean in Mongoose schema?

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.

Which schema types are not supported by mongoose?

Mongoose does not natively support long and double datatypes for example, although MongoDB does.


1 Answers

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'}]
});
like image 65
JohnnyHK Avatar answered Sep 19 '22 18:09

JohnnyHK