Để nối (concatenate) nhiều trường chuỗi thành một trường mới trong MongoDB, sử dụng toán tử $concat trong Aggregation Pipeline stage $project hoặc $addFields.
Tạo dữ liệu mẫu
> db.concatenateFieldsDemo.insertOne({"StudentFirstName":"Adam","StudentLastName":"Smith"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6ebf46d78f205348bc62e") }
> db.concatenateFieldsDemo.insertOne({"StudentFirstName":"John","StudentLastName":"Doe"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6ebfc6d78f205348bc62f") }
> db.concatenateFieldsDemo.insertOne({"StudentFirstName":"David","StudentLastName":"Miller"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6ec376d78f205348bc630") }
> db.concatenateFieldsDemo.insertOne({"StudentFirstName":"Sam","StudentLastName":"Williams"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6ec436d78f205348bc631") }
Xem dữ liệu
> db.concatenateFieldsDemo.find().pretty();
Nối trường với $concat
> db.concatenateFieldsDemo.aggregate([ {$project:{ "StudentFullName":{$concat: ["$StudentFirstName","/","$StudentLastName"]}, "StudentFirstName":1, "StudentLastName":1 }} ]);Kết quả
Giải thích
$concat: [expr1, expr2, ...]: Nối các biểu thức chuỗi theo thứ tự"$StudentFirstName": Tham chiếu giá trị trường StudentFirstName"/": Chuỗi phân tách cố định (literal string)- Kết quả lưu trong trường mới
StudentFullName
Các biến thể hữu ích
1. Nối với khoảng trắng
2. Xử lý trường có thể null/missing
3. Dùng $addFields để giữ tất cả trường gốc
db.concatenateFieldsDemo.aggregate([ {$addFields: { StudentFullName: {$concat: ["$StudentFirstName", " ", "$StudentLastName"]} }} ]);4. Nối nhiều trường
Toán tử chuỗi khác trong Aggregation
| Toán tử | Chức năng |
|---|---|
$substr / $substrBytes / $substrCP | Cắt chuỗi con |
$toLower / $toUpper | Chuyển chữ thường/hoa |
$trim / $ltrim / $rtrim | Xóa khoảng trắng (4.0+) |
$split | Tách chuỗi thành mảng |
$strLenBytes / $strLenCP | Độ dài chuỗi |
Lưu ý
- Tất cả đối số của
$concatphải là chuỗi (string) - Số/Date/ObjectId cần chuyển đổi:
{$toString: "$numericField"} - Kết quả aggregation không lưu vào DB trừ khi dùng
$merge/$out