簡體   English   中英

來自其他館藏的mongoose人口文件

[英]mongoose population of documents from other collections

我正試圖在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);

我希望有人可以解釋我做錯了什么。 謝謝

您需要在零售商文檔中保存對新創建的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' });
            });
        });
    });
};

肯定有一個更好/更簡潔的方法,相應於您的應用程序,但它提供了一個想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM