Lần tới, vui lòng thêm một mẫu tài liệu của bạn để mọi người có thể tái tạo vấn đề của bạn. Đã nói rằng tôi không thấy vấn đề của bạn ở đâu. Tôi đã tạo một số dữ liệu để tái tạo usecase của bạn. Vì vậy, tôi đã thêm tài liệu sau:
{
"_id" : ObjectId("5a0d5d376c9b762a7c035ec4"),
"projectName" : "some stack test",
"price" : NumberInt(45),
"propertyId" : {
"prefix" : "a",
"number" : "7"
}
}
Sau đó, tôi đã thực thi tập lệnh của bạn (không có sắp xếp) và nó hoạt động tốt:
db.yourCollectionName.aggregate([
{
$project: {
"projectName": 1,
"price": 1,
"document": '$$ROOT'
}
},
{
$addFields: {
"document.id": {
$concat: ['$document.propertyId.prefix', '$document.propertyId.number']
}
}
},
{
$match: {
$and: [{
$or: [{
"projectName": {
$regex: '.*' + "some stack test"
}
},
{
"document.id": {
$regex: '.*' + "a" + '.*',
$options: "7"
}
}
]
}]
}
},
{
$replaceRoot: {
newRoot: "$document"
}
}
])
Việc bạn không nhận được kết quả có thể là do các thông số yêu cầu của bạn. Bên cạnh đó làm thế nào để "projectName"
có các thông số tìm kiếm giống như "document.id"
của bạn Chúng có khớp nhau không? Hãy kiểm tra lại quy trình đối sánh của bạn:
{"projectName": {$regex: '.*' + req.query.search + '.*', $options: "i"}},
{'document.id': {$regex: '.*' + req.query.search + '.*', $options: "i"}}