How to set ObjectId as a data type in mongoose

前端 未结 4 1705
感动是毒
感动是毒 2020-12-07 11:31

Using node.js, mongodb on mongoHQ and mongoose. I\'m setting a schema for Categories. I would like to use the document ObjectId as my categoryId.

var mongoos         


        
相关标签:
4条回答
  • 2020-12-07 11:43

    Unlike traditional RBDMs, mongoDB doesn't allow you to define any random field as the primary key, the _id field MUST exist for all standard documents.

    For this reason, it doesn't make sense to create a separate uuid field.

    In mongoose, the ObjectId type is used not to create a new uuid, rather it is mostly used to reference other documents.

    Here is an example:

    var mongoose = require('mongoose');
    
    var Schema = mongoose.Schema,
        ObjectId = Schema.ObjectId;
    var Schema_Product = new Schema({
        categoryId  : ObjectId, // a product references a category _id with type ObjectId
        title       : String,
        price       : Number
    });
    

    As you can see, it wouldn't make much sense to populate categoryId with a ObjectId.

    However, if you do want a nicely named uuid field, mongoose provides virtual properties that allow you to proxy (reference) a field.

    Check it out:

    var mongoose = require('mongoose');
    
    var Schema = mongoose.Schema,
        ObjectId = Schema.ObjectId;
    var Schema_Category = new Schema({
        title       : String,
        sortIndex   : String
    });
    
    Schema_Category.virtual('categoryId').get(function() {
        return this._id;
    });
    

    So now, whenever you call category.categoryId, mongoose just returns the _id instead.

    You can also create a "set" method so that you can set virtual properties, check out this link for more info

    0 讨论(0)
  • 2020-12-07 11:59

    I was looking for a different answer for the question title, so maybe other people will be too.

    To set type as an ObjectId (so you may reference author as the author of book, for example), you may do like:

    const Book = mongoose.model('Book', {
      author: {
        type: mongoose.Schema.Types.ObjectId, // here you set the author ID
                                              // from the Author colection, 
                                              // so you can reference it
        required: true
      },
      title: {
        type: String,
        required: true
      }
    });
    
    0 讨论(0)
  • 2020-12-07 11:59

    My solution on using ObjectId

    // usermodel.js
    
    const mongoose = require('mongoose')
    const Schema = mongoose.Schema
    const ObjectId = Schema.Types.ObjectId
    
    
    let UserSchema = new Schema({
       username: {
         type: String
       },
       events: [{
         type: ObjectId,
         ref: 'Event' // Reference to some EventSchema
       }]
    })
    
    UserSchema.set('autoIndex', true)
    
    module.exports = mongoose.model('User', UserSchema)
    

    Using mongoose's populate method

    // controller.js
    
    const mongoose = require('mongoose')
    const User = require('./usermodel.js')
    
    let query = User.findOne({ name: "Person" })
    
    query.exec((err, user) => {
      if (err) {
         console.log(err)
      }
    
      user.events = events
      // user.events is now an array of events
    })
    
    0 讨论(0)
  • 2020-12-07 12:04

    The solution provided by @dex worked for me. But I want to add something else that also worked for me: Use

    let UserSchema = new Schema({
       username: {
         type: String
       },
       events: [{
         type: ObjectId,
         ref: 'Event' // Reference to some EventSchema
       }]
    })
    

    if what you want to create is an Array reference. But if what you want is an Object reference, which is what I think you might be looking for anyway, remove the brackets from the value prop, like this:

    let UserSchema = new Schema({
       username: {
         type: String
       },
       events: {
         type: ObjectId,
         ref: 'Event' // Reference to some EventSchema
       }
    })
    

    Look at the 2 snippets well. In the second case, the value prop of key events does not have brackets over the object def.

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