如何填充字段是否为空string如果为空不需要填充?

我有一个应用程序,有大量的数据以前保存在mongoDB。 现在我需要填充一些信息,如果referencePeople不是空的string。 在我的应用程序referencePeoplestringtypes而不是mongoose ObjectIdtypes。

我不想改变我的模式。 有没有什么办法可以在填充之前检查referencePeople是否为空。 或者如果是空的,避免填充。

模式:

var OrderSchema = new mongoose.Schema({ customer: {type: mongoose.Schema.Types.ObjectId,ref: 'Customer'}, referencePeople: String, // can be "" or "customer id" ...... }); 

试图咆哮的代码,但得到了一个exception铸造ObjectId失败的价值“”path“ID”

 exports.getOrders = function(req, res) { Order.find({}) .populate('customer') .populate({path: 'referencePeople', model: 'customer'}) .exec(function(error, orders) { if(error) { return res.status(400).send({msg: 'Error occurred while getting orders.', error: error}); } return res.status(200).send(orders); }); }; 

现在我想填充referencePeople,如果它不是空string。 我可以检查填充referencePeople之前是否为空?

是的,你需要使用人口查询的 匹配条款

所以,你的代码应该是这样的:

 exports.getOrders = function(req, res) { Order.find({}) .populate('customer') .populate({ 'path': 'referencePeople', 'match': { 'referencePeople': {'$ne': ''} } }) .exec(function(error, orders) { if(error) { return res.status(400).send({msg: 'Error occurred while getting orders.', error: error}); } return res.status(200).send(orders); }); 

};

mongoose不能处理多层次的人口,填充字段不是文档。 嵌套模式是有帮助的,但这是一个不完整的解决scheme。 相应地devise你的模式。

您正尝试在第二次填充调用中使用现有的ObjectID引用“referencePeople”对象

尝试这个

 exports.getOrders = function(req, res) { Order.find({}) .populate('customer') .exec(function(error, orders) { if(error) { return res.status(400).send({msg: 'Error occurred while getting orders.', error: error}); } //Try changing the referencePeople here return res.status(200).send(orders); }); 

};

参考 : MongoDB