Miha Šušteršič
Miha Šušteršič

Reputation: 10062

mongoose writing data into array object

I have a schema that defines location as an array, into which I would like to write 2 strings (gmaps geocoding lat, long). So far I can't get it to work and can't figure out why. Any help is appreciated.

My schema:

var mongoose = require('mongoose');
var uniqueValidator = require('mongoose-unique-validator');
var Schema = mongoose.Schema;

//shop schema
var ShopSchema = new Schema({
    name: { type: String, required: true, unique: true },
    address: { type: String, required: true },
    location: [{
        latitude: String,
        longitude: String
    }]
});

ShopSchema.plugin(uniqueValidator);

module.exports = mongoose.model('Shop', ShopSchema);

post request:

.post(function(req, res) {
            //create a shop
            var shop = new Shop();
            //set the shop information
            shop.name = req.body.name;
            shop.address = req.body.address;

            //get lat and long before saving from gmaps API
            //build gmaps API URL
            var urlAddress = req.body.address.replace(/ /gi, '+');
            var urlAPIKey = '&key=AIzaSyChkPdCaAaVZwYof8ZbKspokuYt41NlJ_0';
            var url = 'https://maps.googleapis.com/maps/api/geocode/json?address=';
            url = url.concat(urlAddress).concat(urlAPIKey);

            //make a request
            request({
                uri: url,
                method:"GET",
                timeout: 1000
                }, function(error, response, body) {
                    var gmaps = JSON.parse(body);
                    //display the geometry array
                    shop.location.latitude = gmaps.results[0].geometry.location.lat;
                    shop.location.longitude = gmaps.results[0].geometry.location.lng;
                    //save shop and check for errors
                    shop.save(function(err) {
                        if(err) {
                                return res.send(err);
                        }
                        else {
                            res.json({ message:'Shop created! '});
                        }
                    });
            });
        }) //closes .post on /shops

Basically I build an URL, make a request that returns JSON data, parse it, find it, and then try writing it. When I tried writing it without using an object (as properties on shop) it worked.

Thanks for the help

Upvotes: 0

Views: 138

Answers (1)

Valamburi M
Valamburi M

Reputation: 702

In your Shop schema, the location field is of type Array. You have to push the location object into the array after getting the response but you are trying to create an object instead of push object into array.

Change these two lines of your code from

shop.location.latitude = gmaps.results[0].geometry.location.lat;
shop.location.longitude = gmaps.results[0].geometry.location.lng;

to

shop.location.push({ latitude: gmaps.results[0].geometry.location.lat.toString(), longitude: gmaps.results[0].geometry.location.lng.toString() });

Upvotes: 1

Related Questions