当前位置 : 主页 > 网页制作 > Nodejs >

node.js – Mongoose嵌套文档更新失败?

来源:互联网 收集:自由互联 发布时间:2021-06-16
如果我有一个嵌套文档,如何在Mongoose中更新该嵌套文档中的字段? 我使用我能找到的所有可用内容仔细研究了这个问题,甚至更改了我的测试代码以匹配Stackoverflow上有关此问题的类似问
如果我有一个嵌套文档,如何在Mongoose中更新该嵌套文档中的字段?

我使用我能找到的所有可用内容仔细研究了这个问题,甚至更改了我的测试代码以匹配Stackoverflow上有关此问题的类似问题,但我仍然无法弄清楚这一点.这是我的架构和模型,代码和Mongoose调试输出.在这里,我无法理解我做错了什么.

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



*/
您没有在B.update调用中使用正确的字段名称.它应该是这样的:

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

您还应修复重置功能,以便在保存完成之前不调用其回调:

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
}
网友评论