MongoDB không hỗ trợ trực tiếp dùng giá trị trường làm regex pattern trong $regex. Thay vào đó, dùng $indexOfCP (code point index) trong aggregate $expr để kiểm tra substring.
Dữ liệu mẫu
> db.demo88.insertOne({
"Name": "Chris", "PassoutYear": "2020", "websiteName": "chris.shop.com/Carol-2020-"
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2c14c471bf0181ecc422b1") }
> db.demo88.insertOne({
"Name": "David", "PassoutYear": "2010", "websiteName": "david.bigshop.com/David-2010-"
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2c14c571bf0181ecc422b2") }
Truy vấn aggregate với $indexOfCP
Tìm document có trường Name xuất hiện trong websiteName:
> db.demo88.aggregate([
{ "$match": {
"$expr": {
"$ne": [
{ "$indexOfCP": ["$websiteName", "$Name"] },
-1
]
}
}}
]);
Kết quả
{ "_id" : ObjectId("5e2c14c571bf0181ecc422b2"), "Name" : "David", "PassoutYear" : "2010", "websiteName" : "david.bigshop.com/David-2010-" }
Giải thích:
$indexOfCP: Tìm vị trí chuỗi$Nametrong$websiteName(Unicode code point)- Trả về -1 nếu không tìm thấy
$ne: [..., -1]: True nếu tìm thấy (khác -1)$expr: Cho phép dùng biểu thức aggregation trong $match
So sánh: $indexOfCP (Unicode) vs $indexOfBytes (byte) vs $indexOfArray (mảng). Với ASCII thì giống nhau.