Фасетный поиск и выбор нескольких значений - mongodb $ facet - PullRequest
1 голос
/ 02 августа 2020

Я работаю над проектом электронной коммерции и хочу построить в нем фасетный поиск. Я смог создать различные типы фильтров с помощью оператора $ facet. Один из тегов - это цвета. Скажем, я ищу платье и получаю список платьев с их возможными цветами. . ie. цвета [«КРАСНЫЙ», «СИНИЙ», «ОРАНЖЕВЫЙ»]. Теперь, когда я выбираю «КРАСНЫЙ», все остальные цвета go прочь, потому что go фильтры для «КРАСНОГО» «ПЛАТЬЯ».

Но я хочу показать «СИНИЙ» и «ОРАНЖЕВЫЙ» в качестве параметров, поэтому что их тоже можно выбрать. Как это сделать?

[
  {
    "$lookup": {
      "from": "inventories",
      "localField": "colors.sizes.sizeId",
      "foreignField": "sku",
      "as": "inventory"
    }
  },
  {
    "$project": {
      "productId": 1,
      "name": 1,
      "description": 1,
      "brand": 1,
      "mainImage": 1,
      "colors": 1,
      "currency": "HK$",
      "availableOnline": 1,
      "sellingPrice": 1,
      "created": 1,
      "status": 1,
      "tags": 1,
      "available": {
        "$sum": "$inventory.available"
      }
    }
  },
  {
    "$match": {
      "status": "active",
      "productId": {
        "$in": [
          "1604",
          "2062",
          "3706",
          "233",
          "3043",
          "1130",
          "2087",
          "2096",
          "2896",
          "364",
          "2532",
          "2774",
          "5397",
          "451",
          "926",
          "1568",
          "6272",
          "84",
          "655",
          "1714",
          "3187",
          "3489",
          "766",
          "604",
          "1096",
          "2108",
          "3608",
          "1542",
          "626",
          "729",
          "1017",
          "2583",
          "1980",
          "3586",
          "1921",
          "3650",
          "636",
          "2448",
          "2044",
          "3553",
          "5883",
          "213",
          "438",
          "2110",
          "2706",
          "4223",
          "338",
          "578",
          "1738",
          "748",
          "1069",
          "1785",
          "1889",
          "2169",
          "150",
          "256",
          "4715",
          "5116",
          "360",
          "4514",
          "5052",
          "870",
          "5626",
          "131",
          "248",
          "1139",
          "2155",
          "4158",
          "5322",
          "3635",
          "4689",
          "4870",
          "6124",
          "4018"
        ]
      }
    }
  },
  {
    "$addFields": {
      "__order": {
        "$indexOfArray": [
          [
            "1604",
            "2062",
            "3706",
            "233",
            "3043",
            "1130",
            "2087",
            "2096",
            "2896",
            "364",
            "2532",
            "2774",
            "5397",
            "451",
            "926",
            "1568",
            "6272",
            "84",
            "655",
            "1714",
            "3187",
            "3489",
            "766",
            "604",
            "1096",
            "2108",
            "3608",
            "1542",
            "626",
            "729",
            "1017",
            "2583",
            "1980",
            "3586",
            "1921",
            "3650",
            "636",
            "2448",
            "2044",
            "3553",
            "5883",
            "213",
            "438",
            "2110",
            "2706",
            "4223",
            "338",
            "578",
            "1738",
            "748",
            "1069",
            "1785",
            "1889",
            "2169",
            "150",
            "256",
            "4715",
            "5116",
            "360",
            "4514",
            "5052",
            "870",
            "5626",
            "131",
            "248",
            "1139",
            "2155",
            "4158",
            "5322",
            "3635",
            "4689",
            "4870",
            "6124",
            "4018"
          ],
          "$productId"
        ]
      }
    }
  },
  {
    "$match": {
      "tags.colors": {
        "$in": [
          "RED"
        ]
      }
    }
  },
  {
    "$match": {
      "sellingPrice": {
        "$gte": 96,
        "$lte": 47000
      }
    }
  },
  {
    "$facet": {
      "category": [
        {
          "$unwind": "$tags.category"
        },
        {
          "$sortByCount": "$tags.category"
        }
      ],
      "color": [
        {
          "$unwind": "$tags.colors"
        },
        {
          "$sortByCount": "$tags.colors"
        }
      ],
      "size": [
        {
          "$unwind": "$tags.size"
        },
        {
          "$sortByCount": "$tags.size"
        }
      ],
      "season": [
        {
          "$unwind": "$tags.season"
        },
        {
          "$sortByCount": "$tags.season"
        }
      ],
      "brand": [
        {
          "$sortByCount": "$brand"
        }
      ],
      "price": [
        {
          "$unwind": "$tags.price"
        },
        {
          "$group": {
            "_id": null,
            "max": {
              "$max": {
                "$toDouble": "$tags.price"
              }
            },
            "min": {
              "$min": {
                "$toDouble": "$tags.price"
              }
            }
          }
        }
      ],
      "location": [
        {
          "$lookup": {
            "from": "inventories",
            "localField": "colors.sizes.sizeId",
            "foreignField": "sku",
            "as": "inventory"
          }
        },
        {
          "$lookup": {
            "from": "locations",
            "localField": "storeId",
            "foreignField": "storeId",
            "as": "shops"
          }
        },
        {
          "$unwind": "$shops"
        },
        {
          "$unwind": "$shops.stores"
        },
        {
          "$sortByCount": "$shops.stores.name"
        }
      ],
      "data": [
        {
          "$project": {
            "productId": 1,
            "name": 1,
            "description": 1,
            "brand": 1,
            "mainImage": 1,
            "colors": 1,
            "currency": "HK$",
            "availableOnline": 1,
            "sellingPrice": 1,
            "created": 1,
            "__order": 1
          }
        },
        {
          "$sort": {
            "__order": 1
          }
        }
      ]
    }
  }
]

Вот так выглядит схема продукта

{"_id":ObjectId("5f1bd013a945ba002914cb8f"),"created":ISODate("2017-03-22T00:00:00.000Z"),"updated":ISODate("2020-07-25T06:22:41.000Z"),"isPhotoUploadable":true,"status":"active","productId":"4","tags":{"colors":["BLACK","DARK RED","RED"],"size":["42.5","43"],"category":["SHOES","SLIP-ONS","MENS SHOES & ACCESSORIES"],"price":["2650.00","1120.00"],"season":["AW(2017)","SS(2017)"],"hash":["CASUAL","CHINOS","COLOUR","DESIGNER","HORSE","LEATHER","RICH","ROUND","ROUND TOE","SMOOTH","STAPLE","TAILORED","CRAFTED"]},"name":"PENNY LOAFER MOCCASS","description":"A classic, staple style, these penny loafers from Antonio Maurizi are crafted in Italy from smooth leather. Saturated in rich dark brown, this pair can be styled with a pair of casual chinos or tailored pants.","brand":"ANTONIO MAURIZI","mainImage":"https://abc.jpg","styleCode":"111","availableOnline":false,"sellingPrice":2650}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...