Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Dùng giá trị trường làm pattern regex trong MongoDB

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 $Name trong $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.