View a markdown version of this page

$last - Amazon DocumentDB

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

$last

Der $last Operator in Amazon DocumentDB wird verwendet, um das letzte Element in einem Array zurückzugeben, das den Abfragekriterien entspricht. Es ist besonders nützlich, um das neueste oder letzte Element in einem Array abzurufen, das eine bestimmte Bedingung erfüllt.

Parameter

  • expression: Der Ausdruck, der den Array-Elementen entspricht.

Beispiel (MongoDB Shell)

Das folgende Beispiel zeigt die Verwendung des $last Operators in Kombination mit $filter zum Abrufen des letzten Elements aus einem Array, das eine bestimmte Bedingung erfüllt (z. B. ist das Thema „Wissenschaft“).

Erstellen Sie Beispieldokumente

db.collection.insertMany([ { "_id": 1, "name": "John", "scores": [ { "subject": "math", "score": 82 }, { "subject": "english", "score": 85 }, { "subject": "science", "score": 90 } ] }, { "_id": 2, "name": "Jane", "scores": [ { "subject": "math", "score": 92 }, { "subject": "english", "score": 88 }, { "subject": "science", "score": 87 } ] }, { "_id": 3, "name": "Bob", "scores": [ { "subject": "math", "score": 75 }, { "subject": "english", "score": 80 }, { "subject": "science", "score": 85 } ] } ]);

Beispiel für eine Abfrage

db.collection.aggregate([ { $match: { name: "John" } }, { $project: { name: 1, lastScienceScore: { $last: { $filter: { input: "$scores", as: "score", cond: { $eq: ["$$score.subject", "science"] } } } } } } ]);

Ausgabe

[ { _id: 1, name: 'John', lastScienceScore: { subject: 'science', score: 90 } } ]

Beispiel für die Verwendung von Fensteroperatoren (MongoDB Shell)

Neu ab Version 8.0.2.

Der $last Operator kann auch als Fensterbediener auf der $setWindowFields Bühne verwendet werden. In diesem Zusammenhang gibt es den Wert des expression letzten Dokuments in jedem Fenster zurück. Sie geben den Operator unter dem output Feld an und definieren optional die Fenstergrenzen mit einem window Dokument.

Erstellen Sie Beispieldokumente

db.stockPrices.insertMany([ { _id: 1, ticker: "ABC", hour: 1, price: 50 }, { _id: 2, ticker: "ABC", hour: 2, price: 45 }, { _id: 3, ticker: "ABC", hour: 3, price: 60 }, { _id: 4, ticker: "ABC", hour: 4, price: 40 }, { _id: 5, ticker: "XYZ", hour: 1, price: 30 }, { _id: 6, ticker: "XYZ", hour: 2, price: 35 }, { _id: 7, ticker: "XYZ", hour: 3, price: 25 } ]);

Beispiel für eine Abfrage

Das folgende Beispiel partitioniert die Dokumente nachticker, sortiert jede Partition nach und gibt den letzten (letzten) Preis zurückhour, der in jeder Partition aufgezeichnet wurde.

db.stockPrices.aggregate([ { $setWindowFields: { partitionBy: "$ticker", sortBy: { hour: 1 }, output: { lastPrice: { $last: "$price", window: { documents: ["unbounded", "unbounded"] } } } } } ]);

Ausgabe

[ { "_id": 1, "ticker": "ABC", "hour": 1, "price": 50, "lastPrice": 40 }, { "_id": 2, "ticker": "ABC", "hour": 2, "price": 45, "lastPrice": 40 }, { "_id": 3, "ticker": "ABC", "hour": 3, "price": 60, "lastPrice": 40 }, { "_id": 4, "ticker": "ABC", "hour": 4, "price": 40, "lastPrice": 40 }, { "_id": 5, "ticker": "XYZ", "hour": 1, "price": 30, "lastPrice": 25 }, { "_id": 6, "ticker": "XYZ", "hour": 2, "price": 35, "lastPrice": 25 }, { "_id": 7, "ticker": "XYZ", "hour": 3, "price": 25, "lastPrice": 25 } ]

Jedes Dokument wird um den Preis des letzten Dokuments in seinem Fenster erweitert (das letzte Dokument hour in der Partition). lastPrice

Codebeispiele

Um ein Codebeispiel für die Verwendung des $last Operators anzuzeigen, wählen Sie die Registerkarte für die Sprache, die Sie verwenden möchten. Die folgenden Beispiele zeigen sowohl die Verwendung von Ausdrücken (in$project) als auch die Verwendung von Fensteroperatoren (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'); // Expression usage: last element of a filtered array const collection = db.collection('collection'); await collection.insertMany([ { _id: 1, name: "John", scores: [ { subject: "math", score: 82 }, { subject: "english", score: 85 }, { subject: "science", score: 90 } ] }, { _id: 2, name: "Jane", scores: [ { subject: "math", score: 92 }, { subject: "english", score: 88 }, { subject: "science", score: 87 } ] }, { _id: 3, name: "Bob", scores: [ { subject: "math", score: 75 }, { subject: "english", score: 80 }, { subject: "science", score: 85 } ] } ]); const expressionResult = await collection.aggregate([ { $match: { name: "John" } }, { $project: { name: 1, lastScienceScore: { $last: { $filter: { input: "$scores", as: "score", cond: { $eq: ["$$score.subject", "science"] } } } } } } ]).toArray(); console.log('Expression result:', JSON.stringify(expressionResult, null, 2)); // Window operator usage: last value within each partition const stockPrices = db.collection('stockPrices'); await stockPrices.insertMany([ { _id: 1, ticker: "ABC", hour: 1, price: 50 }, { _id: 2, ticker: "ABC", hour: 2, price: 45 }, { _id: 3, ticker: "ABC", hour: 3, price: 60 }, { _id: 4, ticker: "ABC", hour: 4, price: 40 }, { _id: 5, ticker: "XYZ", hour: 1, price: 30 }, { _id: 6, ticker: "XYZ", hour: 2, price: 35 }, { _id: 7, ticker: "XYZ", hour: 3, price: 25 } ]); const windowResult = await stockPrices.aggregate([ { $setWindowFields: { partitionBy: "$ticker", sortBy: { hour: 1 }, output: { lastPrice: { $last: "$price", window: { documents: ["unbounded", "unbounded"] } } } } } ]).toArray(); console.log('Window result:', JSON.stringify(windowResult, null, 2)); 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 # Expression usage: last element of a filtered array collection = db.collection collection.insert_many([ { "_id": 1, "name": "John", "scores": [ { "subject": "math", "score": 82 }, { "subject": "english", "score": 85 }, { "subject": "science", "score": 90 } ] }, { "_id": 2, "name": "Jane", "scores": [ { "subject": "math", "score": 92 }, { "subject": "english", "score": 88 }, { "subject": "science", "score": 87 } ] }, { "_id": 3, "name": "Bob", "scores": [ { "subject": "math", "score": 75 }, { "subject": "english", "score": 80 }, { "subject": "science", "score": 85 } ] } ]) expression_pipeline = [ { "$match": { "name": "John" } }, { "$project": { "name": 1, "lastScienceScore": { "$last": { "$filter": { "input": "$scores", "as": "score", "cond": { "$eq": ["$$score.subject", "science"] } } } } } } ] expression_result = list(collection.aggregate(expression_pipeline)) print('Expression result:', expression_result) # Window operator usage: last value within each partition stock_prices = db.stockPrices stock_prices.insert_many([ { "_id": 1, "ticker": "ABC", "hour": 1, "price": 50 }, { "_id": 2, "ticker": "ABC", "hour": 2, "price": 45 }, { "_id": 3, "ticker": "ABC", "hour": 3, "price": 60 }, { "_id": 4, "ticker": "ABC", "hour": 4, "price": 40 }, { "_id": 5, "ticker": "XYZ", "hour": 1, "price": 30 }, { "_id": 6, "ticker": "XYZ", "hour": 2, "price": 35 }, { "_id": 7, "ticker": "XYZ", "hour": 3, "price": 25 } ]) window_pipeline = [ { "$setWindowFields": { "partitionBy": "$ticker", "sortBy": { "hour": 1 }, "output": { "lastPrice": { "$last": "$price", "window": { "documents": ["unbounded", "unbounded"] } } } } } ] window_result = list(stock_prices.aggregate(window_pipeline)) print('Window result:', window_result) client.close() example()