Запрос встроенных документов с NodeJS и Mongoose - PullRequest
2 голосов
/ 31 января 2012

Мне нужно запросить следующие данные из mongodb: Проект имеет много регионов, регион имеет много ссылок

Вот данные:

{ "_id" : ObjectId( "4f26a74f9416090000000003" ),
  "description" : "A Test Project",
  "regions" : [ 
    { "title" : "North America",
      "_id" : ObjectId( "4f26a74f9416090000000004" ),
      "links" : [ 
        { "title" : "A Really Cool Link" } ] }, 
    { "description" : "That Asia Place",
      "title" : "Asia",
      "_id" : ObjectId( "4f26b7283378ab0000000003" ),
      "links" : [] }, 
    { "description" : "That South America Place",
      "title" : "South America",
      "_id" : ObjectId( "4f26e46b53f2f90000000003" ),
      "links" : [] }, 
    { "description" : "That Australia Place",
      "title" : "Australia",
      "_id" : ObjectId( "4f26ea504fb2210000000003" ),
      "links" : [] } ],
  "title" : "Test" }

Вот мои настройки модели:

// mongoose
var Link = new Schema({
    title       : String
  , href        : String
  , description : String
});

var Region = new Schema({
    title       : String
  , description : String
  , links       : [Link]
});

var Project = new Schema({
    title       : String
  , description : String
  , regions       : [Region]
});

mongoose.model('Link', Link);
mongoose.model('Region', Region);
mongoose.model('Project', Project);

var Link    = mongoose.model('Link');
var Region  = mongoose.model('Region');
var Project = mongoose.model('Project');

Запрос, с которым я борюсь, возвращает один объект региона, соответствующий идентификатору. Я в порядке, возвращая все регионы со всеми соответствующими ссылками, но ограничив его идентификатором только один регион был проблемой.

Вот мой сломанный маршрут, с которым я работаю:

app.get('/projects/:id/regions/:region_id', function(req, res){
  Project.findById(req.param('id'), function(err, project) {
    if (!err) {
      project.regions.findById(req.params.region_id, function(err, region) {
        if (!err) {
          res.render('project_regions', {
            locals: {
              title: project.title,
              project: project
            }
          });
        }
      });
    } else {
      res.redirect('/')
    }
  });
});

Я знаю, что вышеупомянутое не будет работать, потому что объект, возвращаемый "findById", не отвечает на findByID, но он иллюстрирует то, что я пытаюсь сделать. Я пытался выполнить пользовательский запрос, но он всегда возвращал весь документ, а не тот регион, который мне нужен.

Я также попытался выполнить запрос непосредственно из схемы региона, но это не дает никаких результатов. Я предполагаю, что для запроса из Схемы, которая является поддокументом, я должен был бы контекстуально предоставить, что является родительским документом.

Другими словами, следующее не возвращает объект «регион» с данными:

app.get('/projects/:id/regions/:region_id', function(req, res){
  Region.findById(req.params.region_id, function(err, region) {
    if (!err) {
      res.render('project_regions_show', {
        locals: {
          title: "test",
          region: region
        }
      });
    } else {
      res.redirect('/')
    }
  });
});

Ценю любую помощь.

Ответы [ 2 ]

1 голос
/ 14 апреля 2013

Bstar,

Вы можете предотвратить загрузку вложенных документов, используя query.select:

.

т.

Entity.find({ ... })
    .select({childentities: 0}) //excludes childentities
    .exec(function(err, entities){
        ...
        res.json({entities: entities});
    });
0 голосов
/ 31 января 2012

Я бы порекомендовал выделить регионы в отдельную коллекцию с полем «projectId: ObjectId ()».Это может дать вам гибкость запросов, которую вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...