0

私がやろうとしていることは簡単なはずですが、何らかの理由でこれを理解するのが本当に困難です。次の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
});

今、私は次のことをしたい:

  1. カテゴリ ドキュメントを取得する
  2. 特定の埋め込みステータス ドキュメントを検索する (リクエスト パラメータに基づく)
  3. その特定の埋め込まれた 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 で保存するのに適切な形式ではないということです。ただし、その場合は何らかのエラーメッセージが表示されると思います。

それとも、とにかくこれをすべて行うためのより良い方法がありますか?

4

1 に答える 1

0

埋め込まれたドキュメントをコピーしようとしていることが原因である可能性があり、そのドキュメント自体に ObjectId が関連付けられている可能性があります。Status内に複製を保存しようとするBookと、同じ .xml を持つ 2 つの埋め込みドキュメントが作成されますObjectId。新しい Status オブジェクトを作成し、フィールドをコピーしてみてください。

ObjectsId埋め込みドキュメントのドキュメントを見つけるのは難しいですが、ここで言及されています: http://mongoosejs.com/docs/embedded-documents.html .

于 2011-07-06T18:03:32.400 に答える