вам нужно использовать оператор update
, например $set
, $unset
, $push
и т. Д. В вашем запросе на обновление. поскольку вы не используете ни одного из тех, у кого вы получаете такое поведение.
Если вы просто хотите установить отправляемое значение, попробуйте использовать его с $set
.
Попробуйте это:
Report.findByIdAndUpdate(
req.params.id,
{$set : req.body.data } ,
{ new: true },
(err, report) => {
if (err) return res.status(404).send({ message: err.message });
return res.send({ message: "report updated!", report });
}
);
Примечание: $ set переопределяет предыдущее значение.
Если вам нужно что-то еще, прочтите подробную информацию в Обновление MongoDB. Операторская документация
.
obeattie и gregers являются оба правильными. В целом необходимо сохранить параметры маркера в некотором массиве, который Вы будете позже использовать по крайней мере дважды:
Массив или маркеры были бы похожи на массив объектов, чего-то как:
var latlng1 = [
new GLatLng( 48.1234, -120.1234 ),
new GLatLng( 48.5678, -120.5678 ),
new GLatLng( 48.9101, -120.9112 ),
new GLatLng( 48.1121, -120.1314 ),
new GLatLng( 48.3145, -120.1516 ),
new GLatLng( 48.1617, -120.1718 ),
new GLatLng( 48.1819, -120.1920 ),
new GLatLng( 48.2021, -120.2122 )
];
Код для добавления маркеров посмотрел бы что-то подобное:
// assume that map1 is an instance of a GMap2 object
// #0 -- google maps api requires us to call setCenter first before calling any other operation on the map
map1.setCenter( new GLatLng( 0, 0 ), 0 );
// #1 -- add markers
for ( var i = 0; i < latlng1.length; i++ )
{
var marker = new GMarker( latlng1[ i ] );
map1.addOverlay( marker );
}
// #2a -- calculate center
var latlngbounds = new GLatLngBounds( );
for ( var i = 0; i < latlng1.length; i++ )
{
latlngbounds.extend( latlng1[ i ] );
}
// #2b -- set center using the calculated values
map1.setCenter( latlngbounds.getCenter( ), map1.getBoundsZoomLevel( latlngbounds ) );
Что касается Вашего вопроса об использовании серверного сценария в стороне клиента JavaScript, да можно смешать их. Судя Вашим описанием, я думаю, что это - то, что необходимо сделать:
<script type="text/javascript">
var latlng1 = new Array( );
</script>
<script type="text/javascript">
<%
do until rs.eof
%>
latlng1.push( new GLatLng( parseFloat( '<%= rs( "Lat" ) %>' ), parseFloat( '<%= rs( "Lng" ) %>' ) ) );
<%
rs.movenext
loop
%>
</script>
Я отправил статью в: http://salman-w.blogspot.com/2009/03/zoom-to-fit-all-markers-polylines-or.html
Необходимо будет создать новое GMarker
для каждого места Вы хотите отметить на карте. Существует довольно хорошая документация, доступная здесь для GMarker
s.
Создать a GMarker
, Вы будете видеть из документации, что сначала необходимо создать a GLatLng
при представлении местоположения Вы хотите отбросить маркер. Вы не упомянули, что желали любое содержание в воздушном шаре, таким образом, я предполагаю, что это - просто маркер, который Вы после. В Вашем случае вероятно, выглядел бы примерно так код:
var markerCoords = [
new GLatLng(<latitude>, <longitude>),
new GLatLng(<latitude>, <longitude>),
[...]
];
for (coord in markerCoords){
map.addOverlay(new GMarker(coord));
};
Я уверен, что можно, вероятно, сказать точно, что продолжается здесь, но на всякий случай, я создаю массив GLatLng
объекты (это может иметь любую длину [в границах ха-ха]), и затем выполняют итерации по ней, добавляя маркеры к карте для каждого GLatLng
определенный в массиве.
Если Вы будете планированием создания большого количества маркеров, то Вы, вероятно, найдете полезным использовать менеджера по Маркеру, который ускорит рендеринг большого количества маркеров одновременно (не представляя внеэкранные маркеры и уплотняя экранные, если будет много в одном регионе экрана).
obeattie ответил на Ваш довольно хороший вопрос. Но от Вашего примера кода, кажется, что Вы также хотите, чтобы карта масштабировала к области, содержащей маркеры. Чтобы сделать это с несколькими маркерами, можно создать GLatLngBounds, который Вы расширяете для каждого маркера. Можно затем получить центр и масштабирование, которое соответствует для набора маркеров от объекта границ.
var markersBounds = GLatLngBounds(); var coord = null; for (coord in markerCoords){ coord = new GMarker(coord); map.addOverlay(); markersBounds.extend(coord); };
var markersCenter = markersBounds.getCenter();
var markersZoom = G_HYBRID_MAP.getBoundsZoomLevel(markersBounds);
map.setCenter(markersCenter, markersZoom);
Я не на 100% уверен в G_HYBRID_MAP.getBoundsZoomLevel, но если я помню правильно, G_HYBRID_MAP является экземпляром GMapType.
У меня что-то вроде этого, но события не работают. Могу ли я добавить слушателей внутри конструктора объекта?
//Localization object onstructor
function Localization(width, height, description, img_source){
this.point = new GLatLng(width, height);
this.marker = new GMarker(this.point);
this.description = description;
this.img_source = img_source;
GEvent.addListener(this.marker, "click", function(){marker.openInfoWindowHtml(this.description);});
}
//map localizations to show on map
var localizations = [
new Localization( 52.9015797, 15.2602200, 'Poznań1', 'eye1' ),
new Localization( 52.9025797, 15.1602200, 'Poznań2', 'eye2' ),
new Localization( 52.9035797, 15.2702200, 'Poznań3', 'eye3' ),
new Localization( 52.9045797, 15.2102200, 'Poznań4', 'eye4' ),
]
var map = new GMap2(document.getElementById("mapa"));
map.setCenter(localizations[3].point, 13);
map.setUIToDefault();
for(i=0; i < localizations.length; i++){
localization=localizations[i];
map.addOverlay(localization.marker);
localization.marker.openInfoWindowHtml(localization.description);
}