Я попробовал вышеуказанное решение, но я счел его непригодным для больших объемов данных. Затем я обнаружил функцию потока:
MongoClient.connect("...", function(err, db){
var c = db.collection('yourCollection');
var s = c.find({/* your query */}).stream();
s.on('data', function(doc){
c.update({_id: doc._id}, {$set: {name : doc.firstName + ' ' + doc.lastName}}, function(err, result) { /* result == true? */} }
});
s.on('end', function(){
// stream can end before all your updates do if you have a lot
})
})
обычный grep
также отлично справится
grep( "^m", a, ignore.case = TRUE, value = TRUE )
#[1] "Mom" "mother"
тесты
ответ Тома (начинается с) - победитель, но есть место для улучшения (проверьте код startsWith2
)
microbenchmark::microbenchmark(
substr = a[substr(a, 1, 1) %in% c("M", "m")],
grepl = a[grepl("^[Mm]", a)],
grep = grep( "^m", a, ignore.case = TRUE, value = TRUE ),
stringr = unlist(stringr::str_extract_all(a,regex("^M.*",ignore_case = T))),
startsWith1 = a[startsWith(toupper(a), "M")],
startsWith2= a[startsWith(a, c("M", "m"))]
)
# Unit: nanoseconds
# expr min lq mean median uq max neval
# substr 1808 2411.0 3323.19 3314 3917 8435 100
# grepl 3916 4218.0 5438.06 4820 6930 8436 100
# grep 3615 4368.5 5450.10 4820 6929 19582 100
# stringr 50913 53023.0 55764.10 54529 55132 174432 100
# startsWith1 1506 2109.0 2814.11 2711 3013 17474 100
# startsWith2 602 1205.0 1410.17 1206 1507 3013 100
Использование stringr
library(stringr)
unlist(str_extract_all(a,regex("^M.*",ignore_case = T)))
[1] "Mom" "mother"
Используйте grepl
с шаблоном ^[Mm]
:
a[grepl("^[Mm]", a)]
[1] "Mom" "mother"
Вот что означает шаблон ^[Mm]
:
^ from the start of the string
[Mm] match either a lowercase or uppercase letter M
Функция grepl
работает просто утверждая, что шаблон ввода соответствует хотя бы один раз, поэтому нам не нужно беспокоиться об остальной части строки.
substr
- очень удобная базовая функция R:
a[substr(a, 1, 1) %in% c("M", "m")]
# [1] "Mom" "mother"
И поскольку вы упомянули sub()
, то вы могли бы сделать (хотя и не обязательно рекомендуется):
a[sub("(.).*", "\\1", a) %in% c("M", "m")]