4

Mongoose と MongoDB を使用して、タスクをタスクのリストに保存しようとしています。タスク コレクションと対応するリスト ドキュメントに埋め込みドキュメントとして重複して保存したいと考えています。

正常に動作しますが、1 つだけ小さなことがあります。リストの埋め込みドキュメントには objectId がありません。しかし、それらをタスク コレクション内のドキュメントと論理的に接続するために必要です。

私のスキーマ:

var TaskSchema = new Schema({
    _id: ObjectId,
    title: String,
    list: ObjectId

});

var Task = mongoose.model('task', TaskSchema);

var ListSchema = new Schema({
    _id: ObjectId,
    title: String,
    tasks: [Task.schema]
});

var List = mongoose.model('list', ListSchema);

私のコントローラー/ルーター:

app.post('/lists/:list_id/tasks', function(req, res) {

        var listId = req.params.list_id;   

        // 1. Save the new task into the tasks-collection.

        var newTask = new Task();
        newTask.title = req.body.title;
        newTask.list = listId; 

        console.log('TaskId:' + newTask._id);  // Returns undefined on the console!!!

        newTask.save(); // Works fine!

        // 2. Add the new task to the coresponding list.

        list.findById(listId, function(err, doc){

            doc.tasks.push(newTask);

            doc.save();  // Saves the new task in the list but WITHOUT its objectId

            });

        res.redirect('/lists/' + listId)

});

それを達成するためにマングースを別の方法で使用できますか? または、リストに保存する前に、タスクを保存してからクエリを実行する必要がありますか?

アドバイスありがとうございます:-)

4

2 に答える 2

9

populateと呼ばれる素晴らしい機能を使用して解決しました!

また、dtryon は正しかった: モデルで _id ObjectIds を宣言する必要はありません。とにかく追加されます。また、タスクが非同期に保存されているため、このようなものをネストする必要があるため、他のものよりも前に実行されることを確認する必要があります。

解決策は次のとおりです。

スキーマ:

var TaskSchema = new Schema({
    title: String,
    list: { type: Schema.ObjectId, ref: 'list' }

});

var Task = mongoose.model('task', TaskSchema);

var ListSchema = new Schema({
    title: String,
    tasks: [{ type: Schema.ObjectId, ref: 'task' }]
});

var List = mongoose.model('list', ListSchema);

コントローラー/ルーター:

app.post('/lists/:list_id/tasks', function(req, res) {

    var listId = req.params.list_id;   

    var newTask = new Task();
    newTask.title = req.body.title;
    newTask.list = listId; 


    // WHEN SAVING, WRAP THE REST OF THE CODE

    newTask.save(function (err){
       if (err) {
            console.log('error saving new task');
            console.log(err);
        } else {
            console.log('new task saved successfully'); 

            list.findById(listId), function(err, doc){

                doc.tasks.push(newTask);

                doc.save(function (err){
                    if (err) {
                    console.log('error adding new task to list');
                    console.log(err);
                    } else {

                    console.log('new task saved successfully'); 
                    res.redirect('/lists/' + listId);

                    }  
                });
            });
        });
    });
});

現在は正しく参照されており、入力機能を使用すると、エントリに非常に快適にアクセスできます。魅力のように動作します:-)

于 2012-06-06T13:59:41.307 に答える