$

Der $ Positionsoperator identifiziert ein Element in einem Array, das aktualisiert werden soll, ohne explizit die Position des Elements im Array anzugeben. Der $ Operator fungiert als Platzhalter für das erste Element, das der Abfragebedingung entspricht, und das Arrayfeld muss als Teil des Abfragedokuments angezeigt werden.

Syntax

db.collection.updateOne(
  { <array>: <value> },
  { <update operator>: { "<array>.$": <value> } }
)

Die Parameter

Parameter Description
array Das Arrayfeld, das das zu aktualisierende Element enthält. Muss Teil der Abfragebedingung sein.
value Der Wert, der zum Abgleichen des Arrayelements in der Abfragebedingung verwendet wird.
update operator Der anzuwendende Updateoperator (z $set. B. , $inc, $unset).

Examples

Betrachten Sie dieses Beispieldokument aus der Stores-Sammlung.

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

Beispiel 1: Project the first element of an array, matching the condition

Diese Abfrage gibt das erste Element innerhalb des salesByCategory Arrays für DJ Geräte mit totalSales mehr als 35000 zurück.

db.stores.find({
    "sales.salesByCategory": {
        $elemMatch: {
            categoryName: {
                $regex: "^DJ"
            }
        }
    },
    "sales.salesByCategory.totalSales": {
        $gt: 35000
    }
}, {
    "sales.salesByCategory.$": 1
}).limit(2)

Die ersten beiden Ergebnisse, die von dieser Abfrage zurückgegeben werden, sind:

[
  {
    "_id": "d3c9df51-41bd-4b4e-a26b-b038d9cf8b45",
    "sales": {
      "salesByCategory": [
        {
          "categoryName": "DJ Speakers",
          "totalSales": 36972
        }
      ]
    }
  },
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "sales": {
      "salesByCategory": [
        {
          "categoryName": "DJ Headphones",
          "totalSales": 35911
        }
      ]
    }
  }
]

Beispiel 2: Aktualisieren des Rabattprozentsatzes für eine bestimmte Kategorie

Diese Abfrage aktualisiert den Rabattprozentsatz für die Kategorie "Desks" im ersten übereinstimmenden Promotion-Ereignis.

db.stores.updateOne(
  { 
    _id: "905d1939-e03a-413e-a9c4-221f74055aac",
    "promotionEvents.discounts.categoryName": "Desks"
  },
  {
    $set: { "promotionEvents.$.discounts.$[elem].discountPercentage": 25 }
  },
  {
    arrayFilters: [{ "elem.categoryName": "Desks" }]
  }
)

Beispiel 3: Gesamtsumme der Umsatzkategorie aktualisieren

Diese Abfrage aktualisiert den Gesamtumsatz für eine bestimmte Kategorie mithilfe der $ (positional operator).

db.stores.updateOne(
  { 
    _id: "905d1939-e03a-413e-a9c4-221f74055aac",
    "sales.salesByCategory.categoryName": "Desk Lamps"
  },
  {
    $inc: { "sales.salesByCategory.$.totalSales": 1000 }
  }
)