Добавление элемента к объектам JavaScript из результатов запроса [дубликат]

Если вы хотите быть уверенным в своей квоте, вы можете получить ключ API Карт Google , а затем использовать его в моем googleway пакете

library(googleway)

key <- "your_api_key"

google_geocode(address = "Paris", key = key)

# $results
# address_components
# 1   Paris, Paris, Île-de-France, France, Paris, Paris, Île-de-France, FR, locality, political, administrative_area_level_2, political, administrative_area_level_1, political, country, political
# 2 Paris, Lamar County, Texas, United States, Paris, Lamar County, TX, US, locality, political, administrative_area_level_2, political, administrative_area_level_1, political, country, political
# formatted_address geometry.bounds.northeast.lat geometry.bounds.northeast.lng geometry.bounds.southwest.lat
# 1     Paris, France                      48.90214                      2.469921                      48.81557
# 2    Paris, TX, USA                      33.73838                    -95.435455                      33.61185
# geometry.bounds.southwest.lng geometry.location.lat geometry.location.lng geometry.location_type
# 1                      2.225193              48.85661              2.352222            APPROXIMATE
# 2                    -95.627928              33.66094            -95.555513            APPROXIMATE
# geometry.viewport.northeast.lat geometry.viewport.northeast.lng geometry.viewport.southwest.lat geometry.viewport.southwest.lng
# 1                        48.90214                        2.469921                        48.81557                        2.225193
# 2                        33.73838                      -95.435455                        33.61185                      -95.627928
# place_id               types
# 1 ChIJD7fiBh9u5kcRYJSMaMOCCwQ locality, political
# 2 ChIJmysnFgZYSoYRSfPTL2YJuck locality, political
# 
# $status
# [1] "OK"

70
задан Toli Zaslavskiy 24 January 2013 в 17:03
поделиться

2 ответа

Для таких случаев, когда вам нужен простой объект JS вместо экземпляра полной модели, вы можете вызвать lean() в цепочке запросов так:

Survey.findById(req.params.id).lean().exec(function(err, data){
    var len = data.survey_questions.length;
    var counter = 0;

    _.each(data.survey_questions, function(sq){
        Question.findById(sq.question, function(err, q){
            sq.question = q;

            if(++counter == len) {
                res.send(data);
            }
        });
    });
});

Этот способ data уже является простым JS-объектом, с которым вы можете манипулировать, как вам нужно.

131
ответ дан JohnnyHK 20 August 2018 в 07:26
поделиться
  • 1
    Btw @JohnnyHK просто хотел еще раз поблагодарить. Через полтора года помог клиенту отладить что-то. Он провел выходные, пытаясь понять что-то, оказывается, потому что он пытался изменить Mongoose Object; P – Toli Zaslavskiy 14 July 2014 в 14:54
  • 2
    2 года спустя и все еще раздавливая его. Даже не понимал, что существует (). – Petrogad 17 December 2015 в 13:43
  • 3
    При использовании findOne я могу просто изменить объект, а затем вызвать data.save(), который, кажется, работает просто отлично (я добавляю к массиву) – developius 8 February 2016 в 21:38
  • 4
    Как насчет использования aggregate вместо простого find? – Fizzix 1 June 2016 в 00:04
  • 5
    @Fizzix aggregate всегда дает свои результаты как простые объекты, поэтому нет необходимости в lean(). – JohnnyHK 1 June 2016 в 03:59

Я думаю, что документация Mongoose не делает этого достаточно ясным, но данные, возвращенные в запросе (хотя вы можете res.send () это) на самом деле объект Mongoose Document, а НЕ объект JSON. Но вы можете исправить это одной строкой ...

Survey.findById(req.params.id, function(err, data){
    var len = data.survey_questions.length;
    var counter = 0;

    var data = data.toJSON(); //turns it into JSON YAY!

    _.each(data.survey_questions, function(sq){
        Question.findById(sq.question, function(err, q){
            sq.question = q;

            if(++counter == len) {
                res.send(data);
            }
        });
    });
});
37
ответ дан Toli Zaslavskiy 20 August 2018 в 07:26
поделиться
  • 1
    Вы также можете использовать toObject() , что делает то же, что и toJSON(), но с менее запутанным именем. – JohnnyHK 31 May 2015 в 14:35
  • 2
    Будет ли это также избавляться от виртуальных вещей, наложенных разработчиком? – mjwrazor 14 September 2016 в 19:14
  • 3
    TypeError: data.toObject is not a function Я получил это, то же самое с toJSON – Luzan Baral 23 May 2018 в 11:05
Другие вопросы по тегам:

Похожие вопросы: