Proposition: MongoDB-Abfrage bei beidseitigem Referencing

Es sei folgende Modellierung gegeben:

Unter Zuhilfenahme der folgenden Abfrage erhalten wir alle Bestellungen zu der Kundennummer 42 (inklusive allen beinhalteten Produkten sowie dem jeweiligen Bestelldatum).

Hierzu:

  • suchen wir den customer mit custId=42 aus der Customer-Collection,
  • holen über ein Lookup alle Einträge aus der Order-Collection, deren orderId mit den orderIdsaus dem Array customer.orders übereinstimmen,
  • holen über ein geschachteltes Lookup alle orderlines aus der Orderline-Collection, deren orderId mit customer.orders.id übereinstimmt,
  • und wählen schließlich via $project die beiden Felder orders.orderDate aus der order sowie orders.orderlines.productId aus der orderline aus. Das Feld _id ignorieren wir.
// MongoDB
// Ausgabe Bestellungen (Produkte, Bestelldatum)
// des Kunden mit der Kundennummer 42
db.Customer.aggregate([
	{
		"$match": {
		"custId": 42
		}
	},
	{
		"$lookup": {
			"from": "Order",
			"localField": "orders",
			"foreignField": "orderId",
			"as": "orders",
			"pipeline": [
				{
					"$lookup": {
						"from": "Orderline",
						"localField": "orderlines",
						"foreignField": "id",
						"as": "orderlines"
					}
				}
			]
		}
	},
	{
		"$project": {
			"_id": 0,
			"orders.orderDate": 1,
			"orders.orderlines.productId": 1
		}
	}
]);