来自其他馆藏的mongoose人口文件

时间:2017-03-06 15:39:08

标签: node.js mongodb express mongoose mongoose-populate

我正在尝试在RetailersGeofencePoints之间的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

1 个答案:

答案 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' });
            });
        });
    });
};

对于您的应用,肯定有更好/更简洁的方法,但它提供了一个想法。