Partager via


$setUnion

L’opérateur $setUnion retourne un tableau qui contient tous les éléments uniques des tableaux d’entrée. Il traite les tableaux comme des ensembles, supprime les doublons et ignore l’ordre des éléments. Le résultat contient chaque élément unique une seule fois, quel que soit le nombre de fois qu’il apparaît dans les tableaux d’entrée.

Syntaxe

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

Paramètres

Paramètre Descriptif
<array1>, <array2>, ... Deux tableaux ou plus à combiner. Chaque tableau est traité comme un ensemble et les doublons sont supprimés du résultat final.

Examples

Considérez cet exemple de document de la collection des magasins.

{
  "_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
        }
      ]
    }
  ]
}

Exemple 1 : Combiner toutes les catégories de produits

Cette requête récupère une liste de toutes les catégories de produits uniques d’un magasin. La liste comprend les catégories de ventes et de promotion.

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

Cette requête retourne le résultat suivant.

[
  {
    "_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"
    ]
  }
]