2012-03-29 28 views
1

埋め込みドキュメントを既存のドキュメントフィールドに追加しようとしています。検索でone fitting answerが見つかりましたが、エラーが発生しています。私はnode.js、Express、Mongooseを使用しています。埋め込みドキュメント配列にドキュメントを追加

私のデータベース・スキーマ:私が見逃している何TypeError: Object.keys called on non-object

var entry = new Schema({ 
    name  : { type : String, required : true}, 
    description : { type : String, default: ""}, 
}); 

var compo = new Schema({ 
    name  : String, 
    description : String, 
    entries  : [entry] 
}); 

そして、私は次のコードでのエントリの配列を更新しようとしているが

var entry = new entryModel(); 
entry.name = "new name"; 
entry.description= "new description"; 

compoModel.findOne(query, function (err, item) { 
    if (item) { 
    item.entries.push(entry); 
    item.save(function (err) { 
     if (!err) { 
     log.debug('Entry added successfully.'); 
     } else { 
     log.error("Mongoose couldn't save entry: " + err); 
     } 
    }); 
    } 
}); 

これは、エラーを生成します?

答えて

1

Model.updateメソッドを使用して、compo.entriesリストに新しいオブジェクトを追加し、compoModel.updateを呼び出すだけで、それを動作させることができました。

1

同様の問題(同じエラー)は、サブドキュメント配列を消去することで解決しました。これは、サブ文書スキームの定義の前に設定されていました。 これは少なくとも私が起こったと思います。そう、クリアトークンが私のためにそれをやった...

{ username: 'foo', tokens: ['123456'] } 

例えば:

var token = new Schema({ value: String, expires: Date }) 
var user = new Schema({ username: String, tokens: [token] }) 

...と、前に「トークン」スキームを定義するには、私は、次のようなエントリを持っていました。

user.tokens = [] 
user.save() 
関連する問題