Этого можно достичь, используя приведенный ниже конвейер агрегации.
db.students.aggregate([
{
'$addFields': {
'absences': {
'$map': {
'input': '$absences',
'as': 'absence',
'in': {
'date': {
'$toDate': {
'$substr': [
'$absence.date', 0, {
'$subtract': [
{
'$strLenCP': '$absence.date'
}, 5
]
}
]
}
},
'code': '$absence.code',
'type': '$absence.type',
'isPartial': '$absence.isPartial'
}
}
}
}
}, {
'$out': 'students'
}
])
Ваш второй пример не работает при отправке аргумента ссылкой. Вы имели в виду
void copyVecFast(vec<int> original) // no reference
{
vector<int> new_;
new_.swap(original);
}
, Который будет работать, но более легкий путь
vector<int> new_(original);
Они не то же хотя, не так ли? Каждый - копия, другой подкачка . Следовательно имена функций.
Мой фаворит:
a = b;
, Где a
и b
векторы.
Это - другой допустимый способ сделать копию вектора, просто использовать его конструктора:
std::vector<int> newvector(oldvector);
Это еще более просто, чем использование std::copy
для обхода всего вектора от начала до конца к std::back_insert
их в новый вектор.
Однако Ваш .swap()
каждый не копия, вместо этого она подкачивает эти два вектора. Вы изменили бы оригинал для не содержания чего-либо больше! Который не является копией.
Вы не должны использовать подкачку для копирования векторов, она изменила бы "исходный" вектор.
передают оригинал в качестве параметра новому вместо этого.