Sub-document error in Mongoose?

If I have a subdocument, how can I update the field in this subdocument in Mongoose?

I carefully studied this problem, using all available that I could find, and even modified my test code to fit a similar answer to this question about it in Stackoverflow, but I still can not figure it out. Here is my schematic and models, Mongoose debugging code and output. I can't understand what I'm doing wrong here.

var mongoose = require('mongoose') , db = mongoose.createConnection('localhost', 'test') , assert = require("node-assert-extras"); var Schema = mongoose.Schema; var ObjectId = Schema.ObjectId; db.once('open', function () { // yay! }); mongoose.set('debug', true); var PDFSchema = new Schema({ title : { type: String, required: true, trim: true } }) var docsSchema = new Schema({ PDFs : [PDFSchema] }); var A = db.model('pdf', PDFSchema); var B = db.model('docs', docsSchema); function reset(cb) { B.find().remove(); // create some data with a nested document A var newA = new A( { title : "my title" }) var newB = new B( { PDFs: newA}); newB.save(); cb(); } function test1( ) { reset(function() { B.findOne({}, 'PDFs', function(e,o) { console.log(o); pdf_id = o.PDFs[0]._id; console.log("ID " + pdf_id); B.update( { 'pdfs.pdf_id': pdf_id }, { $set: { 'pdfs.$.title': 'new title' }}, function (err, numAffected) { if(err) throw err; assert.equal(numAffected,1); //KA Boom! } ); }); }); } test1(); /* $ node test2.js Mongoose: docs.remove({}) {} Mongoose: docs.findOne({}) { fields: { PDFs: 1 }, safe: true } Mongoose: docs.insert({ __v: 0, PDFs: [ { _id: ObjectId("50930e3d0a39ad162b000002"), title: 'my title' } ], _id: ObjectId("50930e3d0a39ad162b000003") }) { safe: true } { _id: 50930e3d0a39ad162b000003, PDFs: [ { _id: 50930e3d0a39ad162b000002, title: 'my title' } ] } ID 50930e3d0a39ad162b000002 assert.js:102 throw new assert.AssertionError({ ^ AssertionError: 0 == 1 */ 
+4
source share
1 answer

You are not using the correct field names in your B.update call. It should be like this:

 B.update( { 'PDFs._id': pdf_id }, // <== here { $set: { 'PDFs.$.title': 'new title' // <== and here }}, function (err, numAffected) { if(err) throw err; assert.equal(numAffected,1); } ); 

You should also fix your reset function so that you don't call its callback until save complete:

 function reset(cb) { B.find().remove(); // create some data with a nested document A var newA = new A( { title : "my title" }) var newB = new B( { PDFs: newA}); newB.save(cb); // <== call cb when the document is saved } 
+3
source

Source: https://habr.com/ru/post/1443554/


All Articles