2016-09-20 8 views
0

これについて多くの質問がありますが、間違っている箇所は見つかりません。 populateを使用して「外部キー」を取得するとき、フィールドは未定義です。mongooseは未定義のフィールドに値を設定します

ユーザーモデル:

var userSchema = new Schema({ 
    email  : { type: String, required: true, unique: true }, 
    password  : { type: String, required: true }, 
    firstname : { type: String, required: true }, 
    lastname  : { type: String, required: true }, 
    created_at : Date, 
    updated_at : Date, 
    office  : [ { type: Schema.Types.ObjectId, ref: 'Office' } ] 
}); 

var User = mongoose.model('User', userSchema, 'User'); 

module.exports = User; 

オフィスモデル:

var officeSchema = new Schema({ 
    name  : { type: String, required: true }, 
    address  : String, 
    city  : String, 
    geolocation : [ { type: Schema.Types.ObjectId, ref: 'Geolocation' } ], 
    company  : [ { type: Schema.Types.ObjectId, ref: 'Company' } ] 
}); 

var Office = mongoose.model('Office', officeSchema, 'Office'); 

module.exports = Office; 

移入コード:

User.find({}) 
.populate('office') 
//.populate('office', 'name') I tried this too 
.exec(function (err, users) { 
    if (err) return handleError(err); 

    users.forEach(function(user){ 
     console.log('Office name: ', user.office.name); 
    }); 
}); 

私はユーザーのオフィス名を取得したいと思います。しかし、このuser.office.nameは私を返してくれません。私がこれをしたらuser.office私は名前フィールドでオブジェクトを見ることができます。しかし、私は名前フィールドへのアクセス権を持っていません。

+1

'user.office'フィールドはスキーマ内の配列です。 'user.office [0] .name'などを試してください。 –

+0

ニース、そうです!配列なしでデータを使用するようにモデルを変更することはできますか?それが動作します ? – John

+0

'['& ']'を削除することで、スキーマレベルで簡単に変更できます。 –

答えて

2

userSchemaofficeフィールドは配列として定義されます。

user.office 
    .forEach(function(each) { 
     console.log('Office name: ', each.name); 
    }); 
+0

ありがとうございます。私は人口に関する質問があります。私のofficeSchemaで見ることができるように、私は会社と地理位置のオブジェクトIDを持っています。私はオフィスに移住すると同時に、これらの2つのオブジェクトを私のユーザに見つけ出すことは可能ですか? – John

+1

@John http://stackoverflow.com/questions/12821596/multiple-populates-mongoosejs – SkyQ

+0

はいできます。 [Mongoose Deep Populate](https://github.com/buunguyen/mongoose-deep-populate)プラグインをチェックするか、Mongooseがどのように複数のレベルにまたがっているのかを調べることができます(http://mongoosejs.com/ docs/populate.html)。 –

1

あなただけ

populate({path: "office", populate: {path:"company"}}) 

それを」にクエリを編集する必要がありますので、その要素にアクセスするために、ループを使用し、それ以外の場合はuser.office[0].nameuser.office[1].nameなど

を使用会社のデータも入力します。

+0

ああ、私は 'user.office.company.name'でそれをつかむことができます。しかし、あなたはmongoose populateのパフォーマンスがSQLの関係に比べて本当に良いかどうかを知っていますか? – John

+0

@ジョンもちろんドキュメントのデータベースですが、mongoのパフォーマンスはSQLの関係よりも優れています。あなたが答えが好きな人は、アップしてみてください。 –

+0

ああ。私はSQLは、2つのテーブル間の関係を管理する方が良いと聞いた。だからもしNoSQLが十分であれば、私はmongoにとどまります – John

関連する問題