javascript - findbyid - multiple populate mongoose
Mangosta: enviar a ObjectId falló para el valor (2)
El ejemplo de los documentos de mangosta a los que ha hecho referencia usa Number
para el campo personSchema._id
y ObjectId
para los demás.
Supongo que hacen esto en el ejemplo solo para demostrar que es posible usar cualquiera. Si no especifica _id
en el esquema, ObjectId
será el predeterminado.
Aquí, todos sus registros tienen un campo _id
que es un ObjectId
, sin embargo, los está tratando como números. Además, campos como personID
e taskID
no existen, a menos que haya taskID
la parte donde los define.
Si quisiera usar números para todos sus campos _id
, tendría que definir eso en los esquemas.
var newsSchema = new Schema({
_id: Number,
_creator: {type: ObjectId, ref: "Person"},
// ...
})
var personSchema = new Schema({
_id: Number,
// ...
})
Luego, para crear una noticia con una ID particular y asignarla a un creador:
var tony = new Person({_id: 0});
var newsItem = new NewsItem({_id: 0, creator: tony.id});
Sin embargo, lo que hay que tener en cuenta aquí es que cuando utiliza algo distinto de ObjectId
como el campo _id
, asume la responsabilidad de administrar estos valores usted mismo. Los ObjectIds se autogeneran y no requieren administración adicional.
Editar: También noté que estás almacenando referencias en ambos lados de tus asociaciones. Esto es totalmente válido y es posible que desee hacerlo a veces, pero tenga en cuenta que deberá guardar las referencias usted mismo en el pre
hook.
Estoy tratando de especificar el esquema de mi db en mangosta. Por el momento hago esto:
var Schema = mongoose.Schema;
var today = new Date(2011, 11, 12, 0, 0, 0, 0);
var personSchema = new Schema({
_id : Number,
name: { type: String, required: true },
tel: { type: String, required: true },
email: { type: String, required: true },
newsitems: [{ type: Schema.Types.ObjectId, ref:''NewsItem''}]
});
var taskSchema = new Schema({
_id: Number,
description: { type: String, required: true },
startDate: { type: Date, required: true },
newsitems: [{ type: Schema.Types.ObjectId, ref:''NewsItem''}]
});
var newsSchema = new Schema({
_id: Number,
creator : { type: Schema.Types.ObjectId, ref: ''Person'' },
task : { type: Schema.Types.ObjectId, ref: ''Task'' },
date: { type: Date, required:true },
loc: {type: String, required: true }
});
var NewsItem = mongoose.model(''NewsItem'', newsSchema);
var Person = mongoose.model(''Person'', personSchema);
var Task = mongoose.model(''Task'', taskSchema);
var tony = new Person({_id:0, name: "Tony Stark", tel:"234234234", email:"[email protected]" });
var firstTask = new Task({_id:0, description:"Get an interview with the president", startDate:today});
var newsItem1 = new NewsItem({_id:0, creator: tony.id, task: firstTask.id, date: today, loc: "NY"});
newsItem1.save(function (err) {
if (err) console.log(err);
firstTask.save(function (err) {
if (err) console.log(err);
});
tony.save(function (err) {
if (err) console.log(err);
});
});
NewsItem
.findOne({ loc: "NY" })
.populate(''creator'')
.populate(''task'')
.exec(function (err, newsitem) {
if (err) console.log(err)
console.log(''The creator is %s'', newsitem.creator.name);
})
Creo los esquemas e intento guardar algunos datos.
El error:
{ message: ''Cast to ObjectId failed for value "0" at path "creator"'',
name: ''CastError'',
type: ''ObjectId'',
value: ''0'',
path: ''creator'' }
Escribí este código basado en: http://mongoosejs.com/docs/populate.html#gsc.tab=0
El DB que trato de crear se ve así: Especifique el esquema en mangosta .
¿Cómo puedo arreglar esto?
Recibí este error después de crear un esquema: CastError: Cast to ObjectId failed for value “[object Object]” at path “_id”
Luego lo modificó y no pudo rastrearlo. Eliminé todos los documentos de la colección y pude agregar 1 objeto pero no un segundo. Terminé borrando la colección en Mongo y funcionó porque Mongoose recreó la colección.