javascript - Mongo 动态搜索键值查询
问题描述
顺便说一下,我使用 Keystone JS,如何在 Mongo DB 中进行查询。我想从 Vehicle Model 中过滤或获取结果,其中键和值来自例如 { 'Year' => '2019,2018', 'Make' => 'Acura,BMW' } 。它将过滤 where year = 2019 , 2018 与 Make 相同。
我当前的代码
view.on('init', function (next) {
var q = keystone.list('Vehicle').paginate({
page: req.query.page || 1,
perPage: 10,
maxPages: 10,
filters: {
state: 'published',
},
})
.sort('-publishedDate')
if (locals.filters.searchkeys) {
let urlSearchParams = new URLSearchParams(locals.filters.searchkeys)
for (var key of urlSearchParams.keys()) {
console.log("The Key :" , key)
//this part is where it would be dynamic
q.where('Year').in();
}
}
搜索参数
{ 'Year' => '2019,2018', 'Make' => 'Acura,BMW' }
收藏
{ total: 12,
results:
[ { _id: 5d6893cdc02d0e3020f84c85,
DriveType: 'FWD',
FuelType: 'Gasoline Fuel',
ImageList:
'',
Options:
'Traction Control,Stability Control,Front Wheel Drive,Tires - Front All-Season,Tires - Rear All-Season,Aluminum Wheels,Power Steering,4-Wheel Disc Brakes,ABS,Brake Assist,Sun/Moonroof,Generic
Sun/Moonroof,Rear Spoiler,Automatic Headlights,Fog Lamps,Heated Mirrors,Power Mirror(s),Privacy Glass,Intermittent Wipers,Variable Speed Intermittent Wipers,Leather Seats,Power Driver Seat,Bucket Seats,Heated Front Seat(s),Driver Adjustable Lumbar,Passenger Adjustable Lumbar,3rd Row Seat,Pass-Through Rear Seat,Floor Mats,Steering Wheel Audio Controls,Adjustable Steering Wheel,Engine Immobilizer,Tire Pressure Monitor,Power Windows,Power Door Locks,Universal Garage Door Opener,Keyless Entry,Cruise Control,Security System,Climate Control,A/C,Rear A/C,Rear Defrost,AM/FM Stereo,CD Changer,CD Player,Satellite Radio,Entertainment System,Power Outlet,Driver Vanity Mirror,Passenger Vanity Mirror,Driver Illuminated Vanity Mirror,Passenger Illuminated Visor Mirror,Rear Reading Lamps,Driver Air Bag,Passenger Air Bag,Front Side Air Bag,Passenger Air Bag Sensor,Front Head Air Bag,Rear Head Air Bag,Child Safety Locks',
Description: '',
DateInStock: '7/15/2019',
Invoice: 3000,
BookValue: '3686',
MSRP: 0,
SellingPrice: 5592,
Miles: 162111,
Transmission: 'Automatic',
EngineDisplacement: '3.5L',
EngineCylinders: '6',
InteriorColor: '',
ExteriorColor: 'Gray',
Doors: 4,
ModelNumber: 'YF2867JNW',
Trim: 'Ex-L',
Body: 'Convertible',
Model: 'Pilot',
Make: 'Honda',
Year: 2007,
VIN: '5FNYF28677B037628',
Stock: 'K2501A',
Type: 'Used',
image_gallery: [],
__v: 0,
CategorizedOptions: '',
Comment: '',
name: '',
publishedDate: null,
content: [Object],
categories: [],
image: [Object],
state: 'published',
Certified: true } ],
currentPage: 1,
totalPages: 2,
pages: [ 1, 2 ],
previous: false,
next: 2,
first: 1,
last: 1 }
解决方案
假设查询是请求参数进入后端
let request={'Year':'2019,2018', 'Make':'Acura,BMW'}
let query={}
if(request.Year){
let year=request.Year.split(',') // will give array ['2019','2018']
for(let i=0;i<year.length;i++){ //for making array of nos [2019,2018]
year[i]=parseInt(year[i])
}
query.Year={$in:year} // {$in:['2019','2018']}
}
if(request.Make){
query.Make={$in:request.Make.split(',')} // {$in:['Acura','BMW']}
}
var Vehicle = keystone.list('Vehicle');
let q= Vehicle.model.find(query)
.where('state', 'published')
.populate('author')
.sort('-publishedAt')
.limit(5)
.exec(function(err, posts) {
// do something with posts
});
推荐阅读
- javascript - 具有平滑效果的 Sidenav 动画
- python - .encode('utf-8') 重复反斜杠
- javascript - select2 发送 id 而不是文本
- javascript - (反应)页眉和页脚的宽度不同会产生一个滚动X - 如何删除轴X滚动并固定页脚的宽度?
- button - JavaFX - HTMLEditor 工具栏按钮的样式类
- javascript - 滚动到上一个 div
- matlab - 如何获得参数均衡器的幅度值?
- vba - 关于使用 VBA 的阿拉伯字符的建议
- javascript - 使用 JavaScript 将嵌套数组提取到父数组中
- python - 使用请求和正则表达式从网页中提取隐藏的电子邮件