2012-01-31 4 views
2

で埋め込みドキュメントのクエリ: プロジェクトは、多くの地域があり、地域には多くのリンク私はMongoDBのから以下のデータを照会する必要がNodeJSとマングース

を持ってここにデータです:

{ "_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'); 

クエリは、IDに一致する単一領域オブジェクトを返しています。私はすべての領域をそれぞれのリンクで返すのは問題ありませんが、ただ1つの領域のIDに限定することは問題でした。

は、ここに私が働いている私の壊れたルートです:私は「findById」によって返されるオブジェクトはfindByIDに応答しないため、上記動作しません知っている

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('/') 
    } 
    }); 
}); 

が、それは私は何を示していますやろうとしている。私はカスタムクエリを実行しようとしましたが、常にドキュメント全体を返しました。

リージョン・スキーマから直接問合せを試みましたが、結果は返されません。私は親文書が何であるかを文脈的に提供しなければならないサブ文書であるスキーマから問い合わせを行うことを前提としています。言い換えれば

、次のようにデータが「地域」オブジェクトを返しません:

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('/') 
    } 
    }); 
}); 

は、任意の助けに感謝。

+0

ObjectIdを通じてRegionモデルを参照する必要がありました。このチケットは、私が使った人口機能を説明しています:http://stackoverflow.com/questions/7810892/node-js-creating-relationships-with-mongoose – bstar

答えて

0

「projectId:ObjectId()」フィールドを使用してリージョンを別のコレクションに抽出することをおすすめします。それはあなたが探しているクエリの柔軟性を与えるかもしれません。

+0

これは最も理にかなっています。私は、ドキュメントクエリが常にドキュメント全体を返すことに気づいていませんでした。ありがとう。 – bstar

1

bstar、

あなたはquery.selectを使用してロードからサブ文書を防ぐことができます。

すなわち。

Entity.find({ ... }) 
    .select({childentities: 0}) //excludes childentities 
    .exec(function(err, entities){ 
     ... 
     res.json({entities: entities}); 
    }); 
関連する問題