4

ネストされたドキュメントがある場合、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



*/
4

1 に答える 1

3

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

また、完了resetするまでコールバックを呼び出さないように関数を修正する必要があります。save

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
}
于 2012-11-02T00:52:44.843 に答える