首页 > 解决方案 > 如何根据条件将查询链接到 mongoDB 数据库(mongoose)

问题描述

源代码

let placeForSearch="hampi"
let filteredHotelFacilities=req.body.filter //["Free Wifi"]

let hotels = await Hotel.find({placeForSearch})
      .where("facilities")
      .all(filteredHotelFacilities)
      .in(filteredHotelFacilities)
      .select(selectedProperties)
      .skip(pageNumber * pageSize)  
      .limit(pageSize);

req.body.filter上面的代码查找数据库中的设施数组中是否有任何元素,上面的代码输出下面给出的集合。

  {
    facilities: [ 'Garden', 'Free Wifi' ],
    _id: 60f066e61e6971412cf5e727,
    placeForSearch: 'hampi'
  },
  {
    facilities: [ 'Free Wifi' ],
    _id: 60f180141121791e2884d6f0,
    placeForSearch: 'hampi'
  }

数据库

  {
    facilities: [ 'Garden', 'Free Wifi' ],
    _id: 60f066e61e6971412cf5e727,
    placeForSearch: 'hampi'
  },
  {
    facilities: [ 'Garden', 'AC' ],
    _id: 60f066e61e6971412cf5e727,
    placeForSearch: 'hampi'
  },
  {
    facilities: [ 'Free Wifi' ],
    _id: 60f180141121791e2884d6f0,
    placeForSearch: 'hampi'
  }

数据库中的设施数组可以具有以下任何元素或所有元素。

  [
    "Free Wifi",
    "Garden",
    "Water park",
    "Spa and wellness centre",
    "Terrace",
    "Fitness centre",
    "Restaurant",
    "Room service",
    "Bar",
    "Hot tub/jacuzzi",
    "Swimming pool",
    "AC"
  ];

那么如果用户没有应用任何过滤器,我如何才能获取数据库中的所有集合?(req.body.filter=[]

换句话说,我如何.all(filteredHotelFacilities).in(filteredHotelFacilities)根据条件删除。

标签: javascriptnode.jsmongodbexpressmongoose

解决方案


您应该返回一个承诺(通过删除等待)并根据条件进行链式查询,最后查询使用 await 关键字。

let hotels = Hotel.find({placeForSearch})  //remove await keyword

if (filteredHotelFacilities.length > 0) {
   hotels=hotels.where("facilities")       //remove await keyword
                .all(filteredHotelFacilities)
                .in(filteredHotelFacilities);
     }

hotels = await hotels                     // apply await keyword here
   .select(selectedProperties)
   .skip(pageNumber * pageSize)
   .limit(pageSize);

推荐阅读