Соответствует $ и основано на массиве элементов фильтра в MongoDB - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть коллекция в MongoDB CatalogItems. Каждый CatalogItem содержит product с массивом metafields.

. В этих метаполях есть 2 поля: Brand_ID и Article_No

Пример документа CatalogItem:

CatalogItem = {
    product: {
      metafields: [
        {
          key: "Brand_ID",
          value: "317"
        },
        {
          key: "Article_No",
          value: "48630"
        }
      ]
    }
  }

У меня есть массив фильтров, который используется для сопоставления документов CatalogItems на основе этих метаполей

массив фильтров

filter = [
    { brandId: '317', articleId: '48630' },
    { brandId: '257', articleId: 'ZSA04036' }
  ]

Я хочу вернуть все CatalogItems которые соответствуют любой из точных комбинаций в фильтре. Например, чтобы вернуть указанный CatalogItem, я в настоящее время использую этот запрос

// Checks for { brandId: '317', articleId: '48630' }
query = {
    $and: [
      { "product.metafields": { $elemMatch: { key: "Brand_ID", value: filter[0].brandId } } },
      { "product.metafields": { $elemMatch: { key: "Article_No", value: filter[0].articleId } } },
    ]
  }

Проблема, с которой я столкнулся, заключается в том, что для того, чтобы просмотреть все элементы фильтра, мне нужно увеличить индекс фильтра и повторно выполнить запрос ,

Например, при поиске второго индекса фильтра мне пришлось бы изменить filter[0].brandId на filter[1].brandId

Есть ли в пн go способ выполнить запрос, используя вместо этого предопределенный массив объектов? повторного выполнения запроса несколько раз?

1 Ответ

0 голосов
/ 17 апреля 2020

Я нашел способ установить переменные для query, используя $or и .forEach()

let query = {
    $or: []
  };
 filter = [
    { brandId: '317', articleId: '48630' },
    { brandId: '257', articleId: 'ZSA04036' }
  ]

 filter.forEach(filterItem => {
    query.$or.push(
      {
        $and: [
          { "product.metafields": { $elemMatch: { key: "Brand_ID", value: filterItem.brandId } } },
          { "product.metafields": { $elemMatch: { key: "Article_No", value: filterItem.articleId } } },
        ]
      }
    )
  })
...