Condividi tramite


$setUnion

L'operatore $setUnion restituisce una matrice che contiene tutti gli elementi univoci delle matrici di input. Considera le matrici come set, rimuove i duplicati e ignora l'ordine degli elementi. Il risultato contiene ogni elemento univoco una sola volta, indipendentemente dal numero di volte in cui viene visualizzato tra le matrici di input.

Sintassi

{
  $setUnion: [ <array1>, <array2>, ... ]
}

Parametri

Parametro Descrizione
<array1>, <array2>, ... Due o più matrici da combinare. Ogni matrice viene considerata come un set e i duplicati vengono rimossi dal risultato finale.

Esempi

Si consideri questo documento di esempio dalla raccolta negozi.

{
  "_id": "26afb024-53c7-4e94-988c-5eede72277d5",
  "name": "First Up Consultants | Microphone Bazaar - South Lexusland",
  "location": {
    "lat": -29.1866,
    "lon": -112.7858
  },
  "staff": {
    "totalStaff": {
      "fullTime": 14,
      "partTime": 8
    }
  },
  "sales": {
    "totalSales": 83865,
    "salesByCategory": [
      {
        "categoryName": "Lavalier Microphones",
        "totalSales": 44174
      },
      {
        "categoryName": "Wireless Microphones",
        "totalSales": 39691
      }
    ]
  },
  "promotionEvents": [
    {
      "eventName": "Price Cut Spectacular",
      "promotionalDates": {
        "startDate": {
          "Year": 2023,
          "Month": 12,
          "Day": 26
        },
        "endDate": {
          "Year": 2024,
          "Month": 1,
          "Day": 5
        }
      },
      "discounts": [
        {
          "categoryName": "Condenser Microphones",
          "discountPercentage": 5
        },
        {
          "categoryName": "Dynamic Microphones",
          "discountPercentage": 14
        }
      ]
    },
    {
      "eventName": "Bargain Bonanza",
      "promotionalDates": {
        "startDate": {
          "Year": 2024,
          "Month": 3,
          "Day": 25
        },
        "endDate": {
          "Year": 2024,
          "Month": 4,
          "Day": 3
        }
      },
      "discounts": [
        {
          "categoryName": "Streaming Microphones",
          "discountPercentage": 14
        },
        {
          "categoryName": "Microphone Stands",
          "discountPercentage": 14
        }
      ]
    },
    {
      "eventName": "Super Savings Extravaganza",
      "promotionalDates": {
        "startDate": {
          "Year": 2024,
          "Month": 6,
          "Day": 23
        },
        "endDate": {
          "Year": 2024,
          "Month": 6,
          "Day": 30
        }
      },
      "discounts": [
        {
          "categoryName": "Condenser Microphones",
          "discountPercentage": 7
        },
        {
          "categoryName": "Microphone Stands",
          "discountPercentage": 5
        }
      ]
    }
  ]
}

Esempio 1: Combinare tutte le categorie di prodotti

Questa query recupera un elenco di tutte le categorie di prodotti univoche di un negozio. L'elenco include le categorie vendite e promozioni.

db.stores.aggregate([
  { $match: {"_id": "26afb024-53c7-4e94-988c-5eede72277d5"} },
  {
    $project: {
      name: 1,
      salesCategories: "$sales.salesByCategory.categoryName",
      firstPromotionCategories: { $arrayElemAt: ["$promotionEvents.discounts.categoryName", 0] },
      secondPromotionCategories: { $arrayElemAt: ["$promotionEvents.discounts.categoryName", 1] },
      thirdPromotionCategories: { $arrayElemAt: ["$promotionEvents.discounts.categoryName", 2] },
      allUniqueCategories: {
        $setUnion: [
          "$sales.salesByCategory.categoryName",
          { $arrayElemAt: ["$promotionEvents.discounts.categoryName", 0] },
          { $arrayElemAt: ["$promotionEvents.discounts.categoryName", 1] },
          { $arrayElemAt: ["$promotionEvents.discounts.categoryName", 2] }
        ]
      }
    }
  }
])

Questa query restituisce il risultato seguente.

[
  {
    "_id": "26afb024-53c7-4e94-988c-5eede72277d5",
    "name": "First Up Consultants | Microphone Bazaar - South Lexusland",
    "salesCategories": [
      "Lavalier Microphones",
      "Wireless Microphones"
    ],
    "firstPromotionCategories": [
      "Condenser Microphones",
      "Dynamic Microphones"
    ],
    "secondPromotionCategories": [
      "Streaming Microphones",
      "Microphone Stands"
    ],
    "thirdPromotionCategories": [
      "Condenser Microphones",
      "Microphone Stands"
    ],
    "allUniqueCategories": [
      "Lavalier Microphones",
      "Wireless Microphones",
      "Condenser Microphones",
      "Dynamic Microphones",
      "Streaming Microphones",
      "Microphone Stands"
    ]
  }
]