.find()
tidak "mengubah" dokumen yang dikembalikan dengan cara apa pun. Anda hanya dapat "menyertakan" atau "mengecualikan" dalam proyeksi.
Satu-satunya hal yang "diubah" adalah .aggregate()
atau .mapReduce()
.
Untuk .aggregate()
, membutuhkan MongoDB 3.4 untuk $strLenCP
atau $strLenBytes
, tetapi biasanya yang Anda maksud adalah yang pertama:
db.documents.aggregate([
{ "$project": {
"bodyLength": { "$strLenCP": "$body" }
}}
])
Untuk .mapReduce()
db.documents.mapReduce(
function() {
emit(this._id, this.body.length)
},
function() { },
{ "out": { "inline": 1 } }
);
Dan secara realistis dalam kasus terakhir, Anda mungkin juga mengulangi kursor, dan mungkin perlu kecuali jika koleksinya cukup kecil atau Anda benar-benar dapat menampilkan ke koleksi lain sebagai gantinya.
$size
operator yang Anda coba gunakan hanya berlaku untuk "array" untuk mengembalikan jumlah entri yang ada. Dan sekali lagi, ini hanya valid untuk penggunaan dengan .aggregate()
metode.
Jika Anda bermaksud menghilangkan karakter seperti space
dalam string maka $split
dan $reduce
dengan $concat
dapat diterapkan:
db.documents.aggregate([
{ "$addFields": {
"bodyLength": {
"$strLenCP": {
"$reduce": {
"input": { "$split": [ "$name", " "] },
"initialValue": "",
"in": { "$concat": [ "$$value", "$$this" ] }
}
}
}
}}
])
Atau lagi dengan mapReduce()
:
db.documents.mapReduce(
function() {
emit(this._id, "".concat.apply(this.body.split(" ")).length)
// Or even
// emit(this._id, this.body.split(" ").reduce((o,e) => o.concat(e),"").length)
},
function() { },
{ "out": { "inline": 1 } }
);