View a markdown version of this page

$push - Amazon DocumentDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

$push

L'opérateur d'$pushagrégation renvoie un tableau de toutes les valeurs d'une expression spécifiée pour chaque groupe. Il est généralement utilisé au cours de l'$groupétape pour accumuler des valeurs dans un tableau.

Paramètres

  • expression: expression à évaluer pour chaque document du groupe.

Exemple (MongoDB Shell)

L'exemple suivant montre comment utiliser l'$pushopérateur pour collecter tous les noms de produits pour chaque catégorie.

Créez des exemples de documents

db.sales.insertMany([ { _id: 1, category: "Electronics", product: "Laptop", amount: 1200 }, { _id: 2, category: "Electronics", product: "Mouse", amount: 25 }, { _id: 3, category: "Furniture", product: "Desk", amount: 350 }, { _id: 4, category: "Furniture", product: "Chair", amount: 150 }, { _id: 5, category: "Electronics", product: "Keyboard", amount: 75 } ]);

Exemple de requête

db.sales.aggregate([ { $group: { _id: "$category", products: { $push: "$product" } } } ]);

Sortie

[ { _id: 'Furniture', products: [ 'Desk', 'Chair' ] }, { _id: 'Electronics', products: [ 'Laptop', 'Mouse', 'Keyboard' ] } ]

Exemple d'utilisation d'un opérateur de fenêtre (MongoDB Shell)

Nouveau depuis la version 8.0.2.

L'$pushopérateur peut également être utilisé comme opérateur de fenêtre dans la $setWindowFields scène. Dans ce contexte, il renvoie un tableau de toutes les valeurs de l'expression spécifiée pour les documents de chaque fenêtre, dans l'ordre de tri. Vous spécifiez l'opérateur dans le output champ et définissez éventuellement les limites de la fenêtre à l'aide d'un window document.

Note

Lorsqu'il est utilisé comme opérateur de fenêtre dans$setWindowFields, $push est limité à 100 Mo de données intermédiaires. Une opération dépassant cette limite renvoie une erreur.

Créez des exemples de documents

db.purchases.insertMany([ { _id: 1, category: "Electronics", day: 1, product: "Laptop" }, { _id: 2, category: "Electronics", day: 2, product: "Mouse" }, { _id: 3, category: "Electronics", day: 3, product: "Keyboard" }, { _id: 4, category: "Furniture", day: 1, product: "Desk" }, { _id: 5, category: "Furniture", day: 2, product: "Chair" } ]);

Exemple de requête

L'exemple suivant partitionne les documents parcategory, trie chaque partition par day et renvoie une liste de product valeurs depuis le début de la partition jusqu'au document en cours.

db.purchases.aggregate([ { $setWindowFields: { partitionBy: "$category", sortBy: { day: 1 }, output: { productsSoFar: { $push: "$product", window: { documents: ["unbounded", "current"] } } } } } ]);

Sortie

[ { "_id": 1, "category": "Electronics", "day": 1, "product": "Laptop", "productsSoFar": [ "Laptop" ] }, { "_id": 2, "category": "Electronics", "day": 2, "product": "Mouse", "productsSoFar": [ "Laptop", "Mouse" ] }, { "_id": 3, "category": "Electronics", "day": 3, "product": "Keyboard", "productsSoFar": [ "Laptop", "Mouse", "Keyboard" ] }, { "_id": 4, "category": "Furniture", "day": 1, "product": "Desk", "productsSoFar": [ "Desk" ] }, { "_id": 5, "category": "Furniture", "day": 2, "product": "Chair", "productsSoFar": [ "Desk", "Chair" ] } ]

Chaque document est complété par productsSoFar le tableau de toutes les product valeurs de sa partition depuis le début jusqu'au document en cours, dans l'ordre de tri.

Exemples de code

Pour afficher un exemple de code d'utilisation de l'$pushopérateur, choisissez l'onglet correspondant à la langue que vous souhaitez utiliser. Les exemples suivants montrent à la fois l'utilisation de l'accumulateur (in$group) et l'utilisation de l'opérateur de fenêtre (in$setWindowFields) :

Node.js
const { MongoClient } = require('mongodb'); async function example() { const client = await MongoClient.connect('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false'); const db = client.db('test'); // Accumulator usage: collect all values per group const sales = db.collection('sales'); await sales.insertMany([ { _id: 1, category: "Electronics", product: "Laptop", amount: 1200 }, { _id: 2, category: "Electronics", product: "Mouse", amount: 25 }, { _id: 3, category: "Furniture", product: "Desk", amount: 350 }, { _id: 4, category: "Furniture", product: "Chair", amount: 150 }, { _id: 5, category: "Electronics", product: "Keyboard", amount: 75 } ]); const accumulatorResult = await sales.aggregate([ { $group: { _id: "$category", products: { $push: "$product" } } } ]).toArray(); console.log('Accumulator result:', accumulatorResult); // Window operator usage: running list of values within each partition const purchases = db.collection('purchases'); await purchases.insertMany([ { _id: 1, category: "Electronics", day: 1, product: "Laptop" }, { _id: 2, category: "Electronics", day: 2, product: "Mouse" }, { _id: 3, category: "Electronics", day: 3, product: "Keyboard" }, { _id: 4, category: "Furniture", day: 1, product: "Desk" }, { _id: 5, category: "Furniture", day: 2, product: "Chair" } ]); const windowResult = await purchases.aggregate([ { $setWindowFields: { partitionBy: "$category", sortBy: { day: 1 }, output: { productsSoFar: { $push: "$product", window: { documents: ["unbounded", "current"] } } } } } ]).toArray(); console.log('Window result:', windowResult); await client.close(); } example();
Python
from pymongo import MongoClient def example(): client = MongoClient('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false') db = client['test'] # Accumulator usage: collect all values per group sales = db['sales'] sales.insert_many([ { '_id': 1, 'category': 'Electronics', 'product': 'Laptop', 'amount': 1200 }, { '_id': 2, 'category': 'Electronics', 'product': 'Mouse', 'amount': 25 }, { '_id': 3, 'category': 'Furniture', 'product': 'Desk', 'amount': 350 }, { '_id': 4, 'category': 'Furniture', 'product': 'Chair', 'amount': 150 }, { '_id': 5, 'category': 'Electronics', 'product': 'Keyboard', 'amount': 75 } ]) accumulator_result = list(sales.aggregate([ { '$group': { '_id': '$category', 'products': { '$push': '$product' } } } ])) print('Accumulator result:', accumulator_result) # Window operator usage: running list of values within each partition purchases = db['purchases'] purchases.insert_many([ { '_id': 1, 'category': 'Electronics', 'day': 1, 'product': 'Laptop' }, { '_id': 2, 'category': 'Electronics', 'day': 2, 'product': 'Mouse' }, { '_id': 3, 'category': 'Electronics', 'day': 3, 'product': 'Keyboard' }, { '_id': 4, 'category': 'Furniture', 'day': 1, 'product': 'Desk' }, { '_id': 5, 'category': 'Furniture', 'day': 2, 'product': 'Chair' } ]) window_result = list(purchases.aggregate([ { '$setWindowFields': { 'partitionBy': '$category', 'sortBy': { 'day': 1 }, 'output': { 'productsSoFar': { '$push': '$product', 'window': { 'documents': ['unbounded', 'current'] } } } } } ])) print('Window result:', window_result) client.close() example()