multiple findbyid fields array javascript node.js mongodb mongoose populate

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.