我正在尝试在Retailers
和GeofencePoints
之间的API中创建某种关系。零售商对象应该有一个地理围栏点列表。我试图遵循官方文档:http://mongoosejs.com/docs/populate.html。当我执行查询以向零售商提供地理围栏位置时,我得到一个http 200响应,但是当我通过id获得Retail对象时,geofencePoints列表仍然是空的。我究竟做错了什么?这是我的代码:
路线
app.route('/geofencePoints')
.get(geofencePointController.GET)
.post(geofencePointController.POST)
.delete(geofencePointController.DELETE)
app.route('/geofencePoints/:point_id')
.get(geofencePointController.GETid)
.put(geofencePointController.PUTid)
.delete(geofencePointController.DELETEid);
app.route('/retailers')
.get(retailerController.GET)
.post(retailerController.POST);
app.route('/retailers/:retailer_id')
.get(retailerController.GETid)
.put(retailerController.PUTid)
.delete(retailerController.DELETEid);
app.route('/retailers/:retailer_id/geofencePoints')
.put(geofencePointController.PUTgeofencesForRetailId);
geofencePointController.js
var GeofencePoint = require('../model/geofencePoint');
var Retailer = require('../model/retailer');
exports.GET = function (req, res) {
GeofencePoint.find(function (err, points) {
if (err)
res.send(err);
res.json(points);
});
};
exports.POST = function (req, res) {
var geofencePoint = new GeofencePoint();
geofencePoint.name = req.body.name;
geofencePoint.latitude = req.body.latitude;
geofencePoint.longitude = req.body.longitude;
geofencePoint.radius = req.body.radius;
geofencePoint.save(function (err) {
if (err)
return res.json({ success: false, msg: 'Name already exists.' });
res.json({ success: true, msg: 'Successful created new geofence.' });
});
};
exports.DELETE = function (req, res) {
GeofencePoint.remove({
}, function (err, point) {
if (err)
res.send(err);
res.json({ message: 'Successfully deleted all' });
});
};
exports.GETid = function (req, res) {
GeofencePoint.findById(req.params.point_id, function (err, point) {
if (err)
res.send(err);
res.json(point);
});
};
exports.PUTid = function (req, res) {
GeofencePoint.findById(req.params.point_id, function (err, point) {
if (err)
res.send(err);
point.name = req.body.name;
point.latitude = req.body.latitude;
point.longitude = req.body.longitude;
point.radius = req.body.radius;
point.save(function (err) {
if (err)
res.send(err);
res.json({ message: 'Geofence location updated!' });
});
});
};
exports.DELETEid = function (req, res) {
GeofencePoint.remove({
_id: req.params.point_id
}, function (err, point) {
if (err)
res.send(err);
res.json({ message: 'Successfully deleted' });
});
};
//===================================================================
// JOINED DATA
//===================================================================
exports.PUTgeofencesForRetailId = function (req, res) {
Retailer.find({}).populate(req.params.retailer_id).exec(function (err, geofencePoint) {
if (err) return handleError(err);
var geofencePoint = new GeofencePoint();
geofencePoint.name = req.body.name;
geofencePoint.latitude = req.body.latitude;
geofencePoint.longitude = req.body.longitude;
geofencePoint.radius = req.body.radius;
geofencePoint.save(function (err) {
if (err) return res.json({ success: false, msg: 'Something went wrong' });
res.json({ success: true, msg: 'Success' });
});
});
};
retailerController.js
var Retailer = require('../model/retailer');
exports.GET = function (req, res) {
Retailer.find(function (err, retailers) {
if (err)
res.send(err);
res.json(retailers);
});
};
exports.GETid = function (req, res) {
Retailer.findById(req.params.retailer_id, function (err, retailer) {
if (err)
res.send(err);
res.json(retailer);
});
};
exports.POST = function (req, res) {
var retailer = new Retailer();
retailer.name = req.body.name;
retailer.save(function (err) {
if (err)
return res.json({ success: false, msg: 'Name already exists.' });
res.json({ success: true, msg: 'Successful created new retailer.' });
});
};
exports.PUTid = function (req, res) {
Retailer.findById(req.params.retailer_id, function (err, retailer) {
if (err)
res.send(err);
retailer.name = req.body.name;
retailer.save(function (err) {
if (err)
res.send(err);
res.json({ message: 'Retailer updated!' });
});
});
};
exports.DELETEid = function (req, res) {
Retailer.remove({
_id: req.params.point_id
}, function (err, retailer) {
if (err)
res.send(err);
res.json({ message: 'Successfully deleted' });
});
};
retailer.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var retailerSchema = new Schema({
name: {
type: String,
required: true
},
mail: {
type: String,
},
telephone: {
type: String,
},
street: {
type: String,
},
housenumber: {
type: String,
},
postalCode: {
type: String,
},
city: {
type: String,
},
slogan: {
type: String,
},
geofencePoints : [{
type: Schema.Types.ObjectId,
ref: 'GeofencePoint' }]
});
module.exports = mongoose.model('Retailer', retailerSchema);
geofencePoint.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var pointSchema = new Schema({
name: {
type: String,
required: true
},
latitude: {
type: Number,
required: true
},
longitude: {
type: Number,
required: true
},
radius: {
type: Number,
required: true
},
duration: {
type: Number,
},
});
module.exports = mongoose.model('GeofencePoint', pointSchema);
我希望有人可以解释我做错了什么。 THX
答案 0 :(得分:0)
您需要在零售商文档中保存对新创建的 GeofencePoint 的引用。
此外,我不明白为什么你在进行更新时尝试填充零售商(我认为你试图填充错误,这里填充的唯一元素确实是geofencePoint,而不是零售商)。
exports.PUTgeofencesForRetailId = function (req, res) {
var geofencePoint = new GeofencePoint({
name: req.body.name,
latitude: req.body.latitude,
longitude: req.body.longitude,
radius: req.body.radius
});
geofencePoint.save(function (err, geofencePoint) {
if (err) return res.json({ success: false, msg: 'Something went wrong' });
Retailer.findById(req.params.retailer_id, function (err, retailer) {
if (err) return handleError(err);
retailer.geofencePoints.push(geofencePoint._id);
retailer.save(function (err, retailer) {
if (err) return handleError(err);
res.json({ success: true, msg: 'Success' });
});
});
});
};
对于您的应用,肯定有更好/更简洁的方法,但它提供了一个想法。