1

サブドキュメントの配列を持つスキーマを持っています。そのうちの 1 つだけを更新する必要があります。サブドキュメントの ID を使用しfindOneて、返された配列の位置 0 にあるそのサブドキュメントへの応答を切り詰めます。

私が何をしても、親ドキュメントの最初のサブドキュメントしか更新できません。それが 2 番目、3 番目などであっても、最初のサブドキュメントだけが更新されます。私が知る限り、動作するはずですが、私は MongoDB や Mongoose の専門家ではないため、明らかにどこかが間違っています。

 var template = req.params.template;
  var page = req.params.page;
  console.log('Template ID: ' + template);

  db.Template.findOne({'pages._id': page}, {'pages.$': 1}, function (err, tmpl) {
    console.log('Matched Template ID: ' + tmpl._id);
    var pagePath = tmpl.pages[0].body;
    if(req.body.file) {
      tmpl.pages[0].background = req.body.filename;
      tmpl.save(function (err, updTmpl) {
        console.log(updTmpl);
        if (err) console.log(err);
      });
      // db.Template.findOne(tmpl._id, function (err, tpl) {
      //   console.log('Additional Matched ID: ' + tmpl._id);
      //   console.log(tpl);
      //   tpl.pages[tmpl.pages[0].number].background = req.body.filename;
      //   tpl.save(function (err, updTmpl){
      //     if (err) console.log(err);
      //   });
      // });
    }

コンソールでは、すべての ID が適切に一致し、updTmpl を返しても、実際には最初のサブドキュメントが更新され、それが持っていると言っているサブドキュメントではなく、適切なレコードが更新されたと言っています。

念のためのスキーマ:

var envelopeSchema = new Schema({
  background: String,
  body: String
});

var pageSchema = new Schema({
  background: String,
  number: Number,
  body: String
});

var templateSchema = new Schema({
  name: { type: String, required: true, unique: true },
  envelope: [envelopeSchema],
  pagecount: Number,
  pages: [pageSchema]
});
templateSchema.plugin(timestamps);

module.exports = mongoose.model("Template", templateSchema);
4

3 に答える 3

1

まず、更新を実行するために req.body.file を設定する必要がある場合は、クエリを実行する前に確認することをお勧めします。

また、それはタイプミスであり、req.body.file は req.body.filename であるはずですか? 例のためだと思います。

さらに、私はこれについて本格的なテストを行っていませんが、Template._id を指定すると、呼び出しがより効率的になると思います。

var template_id = req.params.template,
    page_id = req.params.page;

if(req.body.filename){

    db.Template.update({_id: template_id, 'pages._id': page_id},
        { $set: {'pages.$.background': req.body.filename} },
        function(err, res){
            if(err){
                // err
            } else {
                // success
            }
        });
} else {
    // return error / missing data
}
于 2013-09-25T10:00:28.477 に答える
0

私はマングースに精通していませんが、モンゴの更新クエリは次のようになります。

db.Template.update( { "pages._id": page }, { $set: { "pages.$.body" : body } } )
于 2013-09-25T07:20:58.537 に答える
0

Mongoose は、位置射影演算子で返されるドキュメントを認識しません。サブドキュメントの配列は常に、ID ではなく位置的に更新されます。あなたは、mongoose が構築している実際のクエリに興味があるかもしれませんmongoose.set('debug', true)

配列全体を取得するか、独自の MongoDB クエリを作成して mongoose を回避する必要があります。前者をお勧めします。配列全体をプルするとパフォーマンスの問題が発生する場合は、各サブドキュメントをトップレベルのドキュメントにする方がよいでしょう。ドキュメントが際限なく大きくなると問題が発生します (少なくとも、Mongo には厳しいドキュメント サイズ制限があるため)。 .

于 2013-09-25T06:43:20.730 に答える