Để tìm thông qua một từ, tất cả các sản phẩm tồn tại trong bộ sưu tập bao gồm trong trường mô tả từ đó, bạn cần đối sánh regex với phân biệt chữ hoa chữ thường. Bạn có thể sử dụng truy vấn sau (làm ví dụ):
db.product.find({"data.description": /test/i});
nơi i
trong / test / i
cho biết phân biệt chữ hoa chữ thường, do đó regex khớp trên trường mô tả cho bất kỳ văn bản nào có chuỗi "test"
. Biểu thức SQL tương đương sau:
select * from product where description like '%test%'
Vì vậy, bạn có thể sử dụng tương tự trong triển khai tuyến đường của mình, sử dụng find ()
để trả về tất cả các tài liệu phù hợp thay vì findOne ()
chỉ trả về một tài liệu:
app.get("/description/:id", auth, function(req, res, next) {
req.collection.find({
"data.description": /req.params.id/i
}, function(e, result) {
if(e) return next(e);
res.send(result);
});
});
Một tùy chọn khác là sử dụng $ text
trong thao tác tìm của bạn vì nó thực hiện tìm kiếm văn bản trên nội dung của các trường được lập chỉ mục bằng chỉ mục văn bản. Vì vậy, điều đầu tiên bạn sẽ làm là tạo một chỉ mục văn bản trên trường mô tả:
db.collection.createIndex( { "data.description": "text" } )
Sau đó, bạn có thể truy vấn bằng toán tử $ text. Ví dụ:truy vấn sau tìm kiếm thuật ngữ cà phê:
db.collection.find( { $text: { $search: "coffee" } } )
CHỈNH SỬA :
Tất cả mọi thứ đều bình đẳng, sau đó bạn có thể cập nhật triển khai tuyến đường của mình để sử dụng các chuỗi truy vấn trong URL thay thế:
app.get("/description", auth, function(req, res, next) {
req.collection.find({
$text: { $search: req.params.q }
}, function(e, result) {
if(e) return next(e);
res.send(result);
});
});
mà bạn có thể truy vấn trong trình duyệt của mình dưới dạng http:// localhost / description? q =product