Как установить ObjectId как тип данных в mongoose - PullRequest
51 голосов
/ 13 ноября 2011

Использование node.js, mongodb на mongoHQ и mongoose.Я устанавливаю схему для категорий.Я хотел бы использовать документ ObjectId в качестве моего categoryId.

var mongoose = require('mongoose');

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;
var Schema_Category = new Schema({
    categoryId  : ObjectId,
    title       : String,
    sortIndex   : String
});

Затем я запускаю

var Category = mongoose.model('Schema_Category');
var category = new Category();
category.title = "Bicycles";
category.sortIndex = "3";

category.save(function(err) {
  if (err) { throw err; }
  console.log('saved');
  mongoose.disconnect();     
});

Обратите внимание, что я не предоставляю значение для categoryId.Я предполагал, что mongoose будет использовать схему для ее генерации, но документ имеет обычный «_id», а не «categoryId».Что я делаю не так?

Ответы [ 4 ]

101 голосов
/ 13 ноября 2011

В отличие от традиционных RBDM, mongoDB не позволяет вам определять любое случайное поле в качестве первичного ключа, поле _id ДОЛЖНО существовать для всех стандартных документов.

По этой причине не имеет смысла создавать отдельное поле uuid.

В mongoose тип ObjectId используется не для создания нового uuid, а для ссылки на другие документы.

Вот пример:

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
});

Как видите, не имеет смысла заполнять categoryId ObjectId.

Однако, если вам действительно нужно поле uuid с хорошим именем, mongoose предоставляет виртуальные свойства, которые позволяют вам прокси (ссылаться) на поле.

Проверьте это:

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;
});

Так что теперь, когда вы вызываете category.categoryId, mongoose просто возвращает _id.

Вы также можете создать метод "set" для настройки виртуальных свойств. Проверьте эту ссылку для получения дополнительной информации

22 голосов
/ 11 января 2017

Я искал другой ответ для названия вопроса, так что, возможно, другие люди тоже будут.

Чтобы установить тип в качестве ObjectId (например, вы можете ссылаться на author как на автора book), вы можете сделать следующее:

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
  }
});
2 голосов
/ 04 сентября 2017

Мое решение об использовании 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)

Используя метод Мангуста

// 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 голосов
/ 19 сентября 2017

Решение, предоставленное @dex, сработало для меня.Но я хочу добавить еще кое-что, что также работает для меня: используйте

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

, если вы хотите создать ссылку на массив.Но если вам нужна ссылка на объект, что, я думаю, вы все равно можете искать, снимите скобки со значения , например:

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

Посмотрите2 отрывка хорошо.Во втором случае значение prop ключевых событий не имеет скобок над объектом def.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...