2011-05-25 6 views
0

私がしようとしているのはまっすぐでなければなりませんが、何らかの理由でこれを理解するのが難しいです。私は以下のMongooseスキーマを持っています(簡略化)。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. は、特定の埋め込まれた状態の文書を探す(要求のparamに基づく)
  2. 割り当てをカテゴリー文書
  3. を取得し、特定の埋め込まれた状態の文書特定のブック文書に変換する。私は既存のブックステータスをいつでも置き換えたいと思っています。ブックのステータスは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(); 
    }); 
}); 

は、上記の罰金を実行するようだと私はすべてのエラーを得ることはありません。ただし、新しいステータスはドキュメントに保存されません。次回は、更新されたブックドキュメントを出力しますが、それはまだ古いステータスになります。私はこれをデバッグし、状態を設定するだけでなくfind()メソッドもうまくいくようです。

私が考えることのできる唯一のことは、私が割り当てている状態の値が何らかの形でMongooseに保存される正しい形式でないことです。しかし、私はいくつかの種類のエラーメッセージを期待します。

これを行うにはもっと良い方法がありますか?

答えて

0

埋め込みドキュメントをコピーしようとしている可能性があります。埋め込みドキュメント自体には、関連するObjectIdが含まれている可能性があります。重複したStatusBook内に保存しようとすると、同じObjectIdの2つの埋め込みドキュメントが作成されます。新しいStatusオブジェクトを作成し、フィールドをコピーしてみてください。

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

関連する問題