24

私はSQLのバックグラウンドから来たので、テーブルを結合するSQLでクエリを書くのは非常に簡単ですが、mongoose/mongodbでそれが欠けていると思います

基本的に、Subscriber_ID (ユーザー コレクション内のドキュメントにマップされます) を知っています。

ユーザーが属するすべてのプロジェクトを含むプロジェクト グループをプルしたいので、これを疑似 SQL で記述すると、次のようになります。

Select 
  ProjectGroup.title, 
  Project.Title 
FROM 
  ProjectGroup, 
  Project, 
  User 
WHERE 
  User.id = req.body.subscriber_id 
  AND Project.subscriber_id = User.id 
  AND  ProjectGroup.project_id = Project.id

タイプがスキーマにマッピングされているため、mongoose/mongodbで同様の結合を行う方法が必要ですか?

私のスキーマ.....

プロジェクト グループ スキーマ

var ProjectGroupSchema = new Schema({
    title             : String
  , projects          : [ { type: Schema.Types.ObjectId, ref: 'Project' } ]
});

プロジェクト スキーマ

var ProjectSchema = new Schema({
    title         : {type : String, default : '', required : true}
  , subscribers   : [{ type: Schema.Types.ObjectId, ref: 'User' }]
});

ユーザースキーマ

var UserSchema = new Schema({
    first_name    : {type: String, required: true}
  , last_name     : {type: String, required: true}
});

ありがとうございました!

4

2 に答える 2

57

あなたはあと一歩です!

プロジェクト グループ スキーマ:

var ProjectGroupSchema = new Schema({
    title             : String
});

プロジェクト スキーマ:

var ProjectSchema = new Schema({
    title         : {type : String, default : '', required : true},
    group         : {type: Schema.Types.ObjectId, ref: 'ProjectGroup' },
    _users    : [{type: Schema.Types.ObjectId, ref: 'User' }]
});

ユーザースキーマ:

var UserSchema = new Schema({
    first_name    : {type: String, required: true},
    last_name     : {type: String, required: true},
    subscribing   : [{type: Schema.Types.ObjectId, ref: 'Project' }]
});

次に、次のことができます。

user.findById(req.userId)
     .populate('subscribing')
     .exec(function(err, user){
          console.log(user.subscribing);
     })

または:

project.find({
        subscriber : req.userId
      })
     .populate('subscriber')
     .populate('group')
     .exec(function(err, projects){
          console.log(projects);
     })
于 2013-01-16T21:05:05.500 に答える
4

Mongodb には結合がありません。この質問は良い参考になると思います:

MongoDB と「結合」

要約すると、リレーショナル DB の結合によって対処される問題については、mongodb でさまざまな戦略を採用する必要があります。主に次の2つのことのいずれかを行うことになると思います。

  • 埋め込み: リレーショナル DB ではさまざまなテーブルに分散される単一のドキュメントに情報を埋め込みます。
  • クライアント側での情報の結合: 複数の場所からの情報を使用する必要がある場合は、何度もクエリを実行してから、断片をクライアントにまとめます。
于 2013-01-16T19:57:35.350 に答える