.find()
không "thay đổi" các tài liệu được trả lại dưới bất kỳ hình thức nào. Bạn chỉ có thể "bao gồm" hoặc "loại trừ" trong phép chiếu.
Những thứ duy nhất "thay đổi" là .aggregate()
hoặc .mapReduce()
.
Đối với .aggregate()
, yêu cầu MongoDB 3.4 cho $strLenCP
hoặc $strLenBytes
, nhưng thông thường ý bạn là cái cũ:
db.documents.aggregate([
{ "$project": {
"bodyLength": { "$strLenCP": "$body" }
}}
])
Đối với .mapReduce()
db.documents.mapReduce(
function() {
emit(this._id, this.body.length)
},
function() { },
{ "out": { "inline": 1 } }
);
Và thực tế trong trường hợp sau, bạn cũng có thể lặp lại con trỏ và có thể cần phải làm vậy trừ khi bộ sưu tập đủ nhỏ hoặc bạn thực sự có thể xuất sang bộ sưu tập khác.
$size
toán tử bạn đang cố gắng sử dụng chỉ áp dụng cho "mảng" để trả về số lượng mục nhập hiện có. Và một lần nữa, nó chỉ hợp lệ để sử dụng với .aggregate()
phương pháp.
Nếu bạn muốn bỏ qua các ký tự như space
trong một chuỗi thì $split
và $reduce
với $concat
có thể được áp dụng:
db.documents.aggregate([
{ "$addFields": {
"bodyLength": {
"$strLenCP": {
"$reduce": {
"input": { "$split": [ "$name", " "] },
"initialValue": "",
"in": { "$concat": [ "$$value", "$$this" ] }
}
}
}
}}
])
Hoặc một lần nữa với 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 } }
);