私がやろうとしていることは簡単なはずですが、何らかの理由でこれを理解するのが本当に困難です。次のMongooseスキーマがあります(簡略化)。
var Status = new Schema({
name : { type: String, required: true },
description : { type: String }
});
var Category = new Schema({
statuses : [Status], // contains a list of all available statuses
// some other attributes
});
var Book = new Schema({
statuses : [Status], // preferably this would not be an array but a single document, but Mongoose doesn't seem to support that
// some other attributes
});
今、私は次のことをしたい:
- カテゴリ ドキュメントを取得する
- 特定の埋め込みステータス ドキュメントを検索する (リクエスト パラメータに基づく)
- その特定の埋め込まれた Status ドキュメントを特定の Book ドキュメントに割り当てます。書籍には常に 1 つのステータスしか設定できないため、既存の書籍ステータスを置き換えたいと考えています。
これが私が現在行っていることです:
mongoose.model('Category').findOne({_id: id}, function(err, category){
if(err) next(err);
var status = category.statuses.id(statusId); // statusId available via closure
book.statuses[0] = status; // book available via closure; trying to replace the existing status here.
book.save(function(err){
if(err) next(err);
next();
});
});
上記は正常に実行されているようで、エラーは発生しません。ただし、新しいステータスはドキュメントに保存されません。次回、更新された Book ドキュメントを出力すると、古いステータスのままになります。これをデバッグしましたが、find() メソッドとステータスの設定は問題ないようです。
今考えられる唯一のことは、どういうわけか、割り当てているステータス値が、Mongoose で保存するのに適切な形式ではないということです。ただし、その場合は何らかのエラーメッセージが表示されると思います。
それとも、とにかくこれをすべて行うためのより良い方法がありますか?