Mã sau hoạt động với không có truy vấn hoặc một chỉ chuỗi truy vấn. Nói cách khác, chỉ cần đi tới /characters
trả về tất cả các ký tự. Nhưng nếu bạn chỉ định tham số chuỗi truy vấn /characters?gender=male
, nó sẽ chỉ trả về các ký tự nam.Làm thế nào để xây dựng một truy vấn có điều kiện trong Mongoose?
Làm thế nào tôi có thể mở rộng này để làm việc với một trong hai , , , hoặc không querystrings? Tôi thực sự muốn tránh viết 8 hoặc 9 câu lệnh if khác nhau cho từng trường hợp. Tôi đã hy vọng Mongoose chỉ đơn giản là bỏ qua một điều khoản $ trong đó nếu đó là null
hoặc undefined
, nhưng đó không phải là trường hợp (xem nhận xét ra mã).
var gender = req.query.gender;
var race = req.query.race;
var bloodline = req.query.bloodline;
var query = Character.find();
if (gender)
query = query.where('gender').equals(gender);
if (race)
query = query.where('race').equals(race);
if (bloodline)
query = query.where('bloodline').equals(bloodline);
/*
query
.where('gender').equals(new RegExp('^' + gender + '$', 'i'))
.where('race').equals(new RegExp('^' + race + '$', 'i'))
.where('bloodline').equals(new RegExp('^' + bloodline + '$', 'i'));
*/
query.exec(function(err, characters) {
if (err) throw err;
res.send(characters);
});
Edit: Vâng, tôi đoán tôi có thể làm điều đó với 7 if-báo cáo cho bây giờ. Trừ khi ai đó tìm thấy một giải pháp thanh lịch hơn.
Chỉnh sửa 2:
Thanks guys. Thật khó để chọn một câu trả lời vì cả hai bạn đã giúp tôi đạt được giải pháp ngắn gọn này. Đây là toàn bộ điều bây giờ.
var conditions = {};
for (var key in req.query) {
if (req.query.hasOwnProperty(key)) {
conditions[key] = new RegExp('^' + req.query[key] + '$', 'i');
}
}
var query = Character.find(conditions);
query.exec(function(err, characters) {
if (err) throw err;
res.send({ characters: characters });
});
Không vấn đề gì, nhưng bạn nên chọn câu trả lời cho người dùng trong tương lai để biết điều gì giúp bạn nhiều hơn. Nếu bạn không thể, hãy suy nghĩ về cách viết câu trả lời của riêng bạn và kiểm tra câu trả lời đó là chính xác. – cschaeffler
Bạn nên xóa Edit 2 của bạn và viết câu trả lời của riêng bạn, đó là tuyệt vời btw –
Rất tốt đẹp - hoạt động tuyệt vời; ngoại trừ phần vệ sinh với RegEx tạo ra các truy vấn lạ. – nottinhill