首页 > 解决方案 > 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 }

标签: javascriptmongodbmongoosemongodb-querynodes

解决方案


假设查询是请求参数进入后端

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
  });

推荐阅读