Partager via


$setEquals

L’opérateur $setEquals retourne true si deux jeux ont les mêmes éléments distincts, quel que soit l’ordre ou les doublons. Il traite les tableaux comme des ensembles et ignore les valeurs dupliquées et l’ordre des éléments.

Syntaxe

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

Paramètres

Paramètre Descriptif
array1, array2, ... Tableaux à comparer pour l’égalité. Vous pouvez spécifier deux tableaux ou plus.

Examples

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

{
    "_id": "0fcc0bf0-ed18-4ab8-b558-9848e18058f4",
    "name": "First Up Consultants | Beverage Shop - Satterfieldmouth",
    "location": {
        "lat": -89.2384,
        "lon": -46.4012
    },
    "staff": {
        "totalStaff": {
            "fullTime": 8,
            "partTime": 20
        }
    },
    "sales": {
        "totalSales": 75670,
        "salesByCategory": [
            {
                "categoryName": "Wine Accessories",
                "totalSales": 34440
            },
            {
                "categoryName": "Bitters",
                "totalSales": 39496
            },
            {
                "categoryName": "Rum",
                "totalSales": 1734
            }
        ]
    },
    "promotionEvents": [
        {
            "eventName": "Unbeatable Bargain Bash",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 6,
                    "Day": 23
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 7,
                    "Day": 2
                }
            },
            "discounts": [
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 7
                },
                {
                    "categoryName": "Bitters",
                    "discountPercentage": 15
                },
                {
                    "categoryName": "Brandy",
                    "discountPercentage": 8
                },
                {
                    "categoryName": "Sports Drinks",
                    "discountPercentage": 22
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 19
                }
            ]
        },
        {
            "eventName": "Steal of a Deal Days",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 21
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 29
                }
            },
            "discounts": [
                {
                    "categoryName": "Organic Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "White Wine",
                    "discountPercentage": 20
                },
                {
                    "categoryName": "Sparkling Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 17
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 23
                }
            ]
        }
    ]
}

Exemple 1 : comparer les catégories de remises entre les événements

Cette requête détermine si deux événements promotionnels offrent des remises sur les mêmes catégories.

db.stores.aggregate([
  { $match: {"_id": "26afb024-53c7-4e94-988c-5eede72277d5"} },
  {
    $project: {
      name: 1,
      event1Categories: { $arrayElemAt: ["$promotionEvents.discounts.categoryName", 0] },
      event2Categories: { $arrayElemAt: ["$promotionEvents.discounts.categoryName", 1] },
      sameDiscountCategories: {
        $setEquals: [
          { $arrayElemAt: ["$promotionEvents.discounts.categoryName", 0] },
          { $arrayElemAt: ["$promotionEvents.discounts.categoryName", 1] }
        ]
      }
    }
  }
])

Cette requête retourne le résultat suivant.

[
  {
    "_id": "26afb024-53c7-4e94-988c-5eede72277d5",
    "name": "First Up Consultants | Microphone Bazaar - South Lexusland",
    "event1Categories": [
      "Condenser Microphones",
      "Dynamic Microphones"
    ],
    "event2Categories": [
      "Streaming Microphones",
      "Microphone Stands"
    ],
    "sameDiscountCategories": false
  }
]

Exemple 2 : Comparer les exigences du personnel

Cette requête détermine si deux magasins ont les mêmes exigences de structure de personnel.

db.stores.aggregate([
  { $match: {"_id": { $in: ["26afb024-53c7-4e94-988c-5eede72277d5", "f2a8c190-28e4-4e14-9d8b-0256e53dca66"] }} },
  {
    $group: {
      _id: null,
      stores: { $push: { _id: "$_id", name: "$name" }}
    }
  },
  {
    $project: {
      store1: { $arrayElemAt: ["$stores", 0] },
      store2: { $arrayElemAt: ["$stores", 1] },
      staffTypes1: ["fullTime", "partTime"],
      staffTypes2: ["fullTime", "partTime"],
      sameStaffStructure: {
        $setEquals: [
          ["fullTime", "partTime"],
          ["fullTime", "partTime"]
        ]
      }
    }
  }
])

Cette requête retourne le résultat suivant.

[
  {
    "_id": null,
    "store1": {
      "_id": "26afb024-53c7-4e94-988c-5eede72277d5",
      "name": "First Up Consultants | Microphone Bazaar - South Lexusland"
    },
    "store2": {
      "_id": "f2a8c190-28e4-4e14-9d8b-0256e53dca66",
      "name": "Fabrikam, Inc. | Car Accessory Outlet - West Adele"
    },
    "staffTypes1": ["fullTime", "partTime"],
    "staffTypes2": ["fullTime", "partTime"],
    "sameStaffStructure": true
  }
]

Exemple 3 : Comparer des jeux avec des doublons

Cette requête utilise l’opérateur $setEquals pour ignorer les doublons et l’ordre.

db.stores.aggregate([
  { $match: {"_id": "26afb024-53c7-4e94-988c-5eede72277d5"} },
  {
    $project: {
      name: 1,
      array1: ["Microphones", "Stands", "Microphones", "Accessories"],
      array2: ["Stands", "Accessories", "Microphones"],
      arraysEqual: {
        $setEquals: [
          ["Microphones", "Stands", "Microphones", "Accessories"],
          ["Stands", "Accessories", "Microphones"]
        ]
      }
    }
  }
])

Cette requête retourne le résultat suivant.

[
  {
    "_id": "26afb024-53c7-4e94-988c-5eede72277d5",
    "name": "First Up Consultants | Microphone Bazaar - South Lexusland",
    "array1": ["Microphones", "Stands", "Microphones", "Accessories"],
    "array2": ["Stands", "Accessories", "Microphones"],
    "arraysEqual": true
  }
]