0

Я новичок в разработке Mongoose и Nodejs в целом, и у меня есть немного путаницы в том, как правильно настроить сохранение моих записей. Вот мои две схемы:Сохранение Mongoose для населения

Скачать

var mongoose = require("mongoose"); 
var Schema = mongoose.Schema; 

var downloadSchema = Schema({ 
    title  : String, 
    description : String, 
    _project  : { type: Schema.Types.ObjectId, ref: 'Project' } 
}); 

module.exports = mongoose.model('Download', downloadSchema); 

Проект

... 

var projectSchema = Schema({ 
    name   : String, 
    url   : String, 
    pwd   : String, 
    _downloads : [{type: Schema.Types.ObjectId, ref: 'Download' }] 
}); 

module.exports = mongoose.model('Project', projectSchema); 

Это, кажется, работает правильно. В документации объясняется мой случай использования загрузки и компоновки проекта, но я не уверен, как правильно заполнить Project._downloads. Вот что я сделал:

Экспресс маршрута Обработчика:

function createDownload(req, res) { 

    // the Project Id is passed in the req.body as ._project 
    var dldata = req.body; 

    Project.findOne({ _id : dldata._project }, function(err, project) { 
     var dload = new Download(dldata); 


     dload.save(function (err, download) { 

      project._downloads.push(download._id); 
      project.save(function(err){ 
       var msg = {}; 
       if(err) { 
        msg.status = 'error'; 
        msg.text = err; 
       }else { 
        msg.status = 'success'; 
        msg.text = 'Download created successfully!'; 
       } 

       res.json(msg); 
      }); 

     }); 
    }); 
} 

Это кажется усложненным мне. Должен ли я быть вручную push, относящимся к массиву ._downloads, или что-то, что Mongoose должно обрабатывать внутренне на основе схемы? Есть ли лучший способ добиться этого, так что я могу сделать:

Download.find().populate('_project').exec(... 

, а также:

Project.findOne({_id : _projectId}).populate('_downloads').exec(... 

ответ

1

Согласно есть 2 способа добавления subdocs к родительскому объекту:

1) с помощью метода нажатия()

2) с помощью метода создания()

Так что я думаю, что ваш код может быть немного упростить, устраняя операцию сохранения нового загрузки пункт:

function createDownload(req, res) { 
    var dldata = req.body; 

    Project.findOne({ _id : dldata._project }, function(err, project) { 
     // handle error 

     project._downloads.push(dldata); 

     project.save(function(err) { 
      // handle the result 
     }); 
    }); 
} 

или

function createDownload(req, res) { 
    var dldata = req.body; 

    Project.findOne({ _id : dldata._project }, function(err, project) { 
     // handle error 

     project._downloads.create(dldata); 

     project.save(function(err) { 
      // handle the result 
     }); 
    }); 
} 
+0

Спасибо! Как только я изменил схему проекта для '._downloads', чтобы:' _downloads: [Download.schema] 'работал как шарм. Я не знал достаточно, чтобы даже посмотреть на субдоки, поэтому спасибо за то, что указал мне в правильном направлении. –

+0

Рад, что я смог помочь! –