type new foreign array node.js mongoose

node.js - new - populate array mongoose



Cómo establecer ObjectId como un tipo de datos en mangosta (4)

A diferencia de los RBDM tradicionales, mongoDB no le permite definir ningún campo aleatorio como la clave principal, el campo _id DEBE existir para todos los documentos estándar.

Por esta razón, no tiene sentido crear un campo uuid separado.

En mangosta, el tipo ObjectId se utiliza para no crear un nuevo uuid, sino que se utiliza principalmente para hacer referencia a otros documentos.

Aquí hay un ejemplo:

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

Como puede ver, no tendría mucho sentido rellenar categoryId con un ObjectId.

Sin embargo, si desea un campo uuid muy bien nombrado, Mangosta proporciona propiedades virtuales que le permiten representar (referenciar) un campo.

Echale un vistazo:

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

Entonces, cada vez que llamas a category.categoryId, mangosta simplemente devuelve el _id en su lugar.

También puede crear un método "set" para que pueda establecer propiedades virtuales, consulte este enlace para obtener más información

Usando node.js, mongodb en mongoHQ y mangosta. Estoy configurando un esquema para Categorías. Me gustaría usar el documento ObjectId como mi categoryId.

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

Entonces corro

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

Tenga en cuenta que no proporciono un valor para categoryId. Supuse que Mangosta usará el esquema para generarlo, pero el documento tiene el "_id" usual y no "categoryId". ¿Qué estoy haciendo mal?


Estaba buscando una respuesta diferente para el título de la pregunta, por lo que quizás otras personas también lo hagan.

Para establecer el tipo como un Id. De objeto (por lo tanto, puede hacer referencia al author como autor del book , por ejemplo), puede hacer lo siguiente:

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


La solución provista por @dex funcionó para mí. Pero quiero agregar algo más que también funcionó para mí: uso

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

si lo que quieres crear es una referencia de matriz. Pero si lo que quiere es una referencia a Object, que es lo que creo que podría estar buscando de todos modos, elimine los corchetes del valor prop, como este:

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

Mira bien los 2 fragmentos. En el segundo caso, el valor prop de los eventos clave no tiene corchetes sobre la definición del objeto.


Mi solución sobre el uso de 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)

Usando el método poping de la mangosta

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