2017-07-15 70 views
0

我目前正在使用猫鼬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); 

后以上配置到位后,我创建了一个Chair文件和一个Target文件。

之后,我调用下面的逻辑路径上得到一个Transport文件:

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

下面是检索文件:

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

因此,即使我质疑ChairsTargets集合,我确实至少有1个文档,Transport文档没有得到填充。

此外,我也尝试过的.populate()的增强版本,但我不断收到空数组:

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

你怎么了'Chair'和'Target'文档添加到'TransportModel'文件? – robertklep

+0

感谢您的回复,@robertklep。这就是我想用'.populate()'实现的目标,我希望'Transport'文件的'chairs'和'targets'数组自动填充整个可用的'Chair'和'Target'列表来自各自馆藏的文件。 –

+0

尽管这不是人口的问题。这是将各个集合中的_particular_文档关联起来的一种手段。换句话说,您必须手动将新的“Chair”文档与“TransportModel”文档相关联。然后'.populate()'方法将在查询期间自动添加关联的文档。请参阅文档:http://mongoosejs.com/docs/populate.html – robertklep

回答

-1

如果你已经按新的椅子和指标纳入交通运输模式,您可以用更好的填充它猫鼬深填充模块,这里是一个简单的配置如何设置它的例子。

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