2017-07-15 9 views
0

現在、mongoose v4.10.8を使用しています。定義済みのモデルに複数の配列を設定しようとしています。mongoose.populate空の配列を返します

TransportModel.js

//Transport model 
'use strict'; 
const mongoose = require('mongoose'); 

const TransportSchema = new mongoose.Schema({ 
    tag: { 
     type: String, 
     enum: ['X', 'Y'], 
     required: true, 
     unique: true 
    }, 
    chairs: [{ 
     type: mongoose.Schema.Types.ObjectId, 
     ref: "Chair" 
    }], 
    targets: [{ 
     type: mongoose.Schema.Types.ObjectId, 
     ref: "Target" 
    }] 
}); 

module.exports = mongoose.model('Transport', TransportSchema); 

ChairModel.js

//Chair model 
'use strict'; 
const mongoose = require('mongoose'); 

const ChairSchema = new mongoose.Schema({ 
    product_name: { 
     type: String, 
     required: true, 
     unique: true 
    }, 
    description: { 
     type: String, 
     unique: false, 
     required: false 
    } 
}); 

module.exports = mongoose.model('Chair', ChairSchema); 

TargetModel.js

//Target model 
'use strict'; 
const mongoose = require('mongoose'); 

const TargetSchema = new mongoose.Schema({ 
    target_name: { 
     type: String, 
     required: true, 
     unique: true 
    }, 
    location: { 
     type: String, 
     required: true, 
     unique: false 
    }, 
    description: { 
     type: String, 
     unique: false, 
     required: false 
    } 
}); 

module.exports = mongoose.model('Target', TargetSchema); 

た後上記の設定では、私はという文書を1つ作成しました。

以下
TransportModel.findOne({ 
     tag: 'X' 
    }) 
    .populate("chairs") 
    .populate("targets") 
    .exec(function(err, transport) { 
     if (err) { 
      console.error(err); 
     } 
     console.log('Transport: ', transport); 
    }); 
}); 

が検索された文書である:

はその後、私は単一Transport文書を取得するためにルート上の次のロジックを呼び出す私が照会にもかかわらず、このよう

{ 
    "_id": "xxxx9999xxxx9999xxxx9999", 
    "tag": "X", 
    "__v": 1, 
    "chairs": [], 
    "targets": [] 
} 

Chairsし、 Targetsコレクションで、少なくとも1つのドキュメントがあると、Transportドキュメントにデータが読み込まれません。

はさらに、私はまた、.populate()の強化版を試してみましたが、私は空の配列を取得しておいてください。

.populate({ 
    path: "chairs", 
    model: "Chair" 
}) 
.populate({ 
    path: "targets", 
    model: "Target" 
}) 
+0

どのように 'TransportModel'文書に' Chair'と 'Target'のドキュメントを追加しましたか? – robertklep

+0

返信いただきありがとうございます、@robertklep。それは私が '.populate()'で達成しようとしているものです。私は '' Chair''と '' Target''の利用可能なリストのすべてを自動的に読み込む '' Transport'文書の ''椅子 ''と '' targets'配列それぞれのコレクションからの文書。 –

+0

それは人口とは異なります。これは、コレクション間で特定のドキュメントを関連付ける手段です。言い換えれば、新しい 'Chair'文書を' TransportModel'文書に手動で関連付ける必要があります。 '.populate()'メソッドは、クエリ中に自動的に関連ドキュメントを追加します。以下のドキュメントを参照してください。http://mongoosejs.com/docs/populate.html – robertklep

答えて

-1

すでに輸送モデルに新しい椅子や目標をプッシュする場合は、あなたがより良い、それを移入することができますmongoose-deep-populateモジュールは、設定する方法の簡単な例です。

var mongoose = require('mongoose'); 
var deepPopulate = require('mongoose-deep-populate')(mongoose); 

var Schema = mongoose.Schema; 

var kindsSchema = new Schema({ 

    name:{type:String,required:true,unique:true}, 
    components:[{type:Schema.ObjectId,ref:'components'}], 
    associatedView:{type:String,default:'home/fragances'}, 
    discount:{type:Number,default:0}, 
    description:{type:String,default:'Nueva categoria'}, 

    created_at:{type:Date,default:Date.now}, 
    modified_at:{type:Date,required:true} 
}); 

kindsSchema.plugin(deepPopulate,{ 
    whitelist:[ 
    'components.attributes', 
    ] 
    populate:{ 
     'components':{ 
     select['attributes','discount'] 
     } 
    } 
}); 

https://www.npmjs.com/package/mongoose-deep-populate

+2

これはなぜよりよいのでしょうか? – robertklep

関連する問題