Подтвердить что ты не робот

Как установить ObjectId как тип данных в мангусте

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

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. Я предположил, что мангуста будет использовать схему для ее создания, но в документе есть обычный "_id", а не "categoryId". Что я делаю неправильно?

4b9b3361

Ответ 1

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

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

В мангусте тип 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", чтобы вы могли установить виртуальные свойства, посмотрите эту ссылку для получения дополнительной информации

Ответ 2

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

Чтобы установить тип как 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
  }
});

Ответ 3

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

Использование mongoose populate метод

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

Ответ 4

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

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

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

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

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