MongoDB-Felder projizieren

MongoDBMongoDBBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Labyrinth lernen Sie, wie Sie MongoDB-Projektionen verwenden, um bestimmte Felder bei der Abfrage von Dokumenten auszuwählen und auszuschließen. Die Projektion ermöglicht es Ihnen, zu steuern, welche Felder in den Abfrageergebnissen zurückgegeben werden, was dazu führt, dass Sie unnötige Datenübertragungen reduzieren und die Abfrageleistung verbessern können. Sie beginnen mit der Auswahl von eingeschlossenen Feldern, gehen dann zu der Angabe von auszuschließenden Feldern über, mischen eingeschlossene und auszuschließende Felder, projizieren geschachtelte Felder und formatieren die Ausgabefelder. Am Ende dieses Labyrinths werden Sie eine solide Vorstellung davon haben, wie Sie Projektionen in Ihren MongoDB-Abfragen effektiv nutzen können.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/DataTypesGroup(["Data Types"]) mongodb(("MongoDB")) -.-> mongodb/ArrayandEmbeddedDocumentsGroup(["Array and Embedded Documents"]) mongodb(("MongoDB")) -.-> mongodb/AggregationOperationsGroup(["Aggregation Operations"]) mongodb/BasicOperationsGroup -.-> mongodb/start_mongodb_shell("Start MongoDB Shell") mongodb/QueryOperationsGroup -.-> mongodb/find_documents("Find Documents") mongodb/QueryOperationsGroup -.-> mongodb/project_fields("Project Fields") mongodb/DataTypesGroup -.-> mongodb/work_with_array_data_types("Work with Array Data Types") mongodb/ArrayandEmbeddedDocumentsGroup -.-> mongodb/query_embedded_documents("Query Embedded Documents") mongodb/AggregationOperationsGroup -.-> mongodb/aggregate_group_totals("Aggregate Group Totals") subgraph Lab Skills mongodb/start_mongodb_shell -.-> lab-422089{{"MongoDB-Felder projizieren"}} mongodb/find_documents -.-> lab-422089{{"MongoDB-Felder projizieren"}} mongodb/project_fields -.-> lab-422089{{"MongoDB-Felder projizieren"}} mongodb/work_with_array_data_types -.-> lab-422089{{"MongoDB-Felder projizieren"}} mongodb/query_embedded_documents -.-> lab-422089{{"MongoDB-Felder projizieren"}} mongodb/aggregate_group_totals -.-> lab-422089{{"MongoDB-Felder projizieren"}} end

Wählen Sie eingeschlossene Felder aus

In diesem Schritt lernen Sie, wie Sie MongoDB-Projektionen verwenden, um bestimmte Felder bei der Abfrage von Dokumenten auszuwählen. Die Projektion ermöglicht es Ihnen, genau zu steuern, welche Felder in Ihren Abfrageergebnissen zurückgegeben werden.

Beginnen wir zunächst mit dem Start der MongoDB-Shell und erstellen eine Beispielsammlung, mit der wir arbeiten können:

mongosh

Sobald Sie in der MongoDB-Shell sind, erstellen Sie eine Datenbank und fügen einige Beispielbenutzerdokumente hinzu:

use projectlab_database

db.users.insertMany([
    {
        name: "John Doe",
        age: 30,
        email: "[email protected]",
        city: "New York",
        job: "Software Engineer"
    },
    {
        name: "Jane Smith",
        age: 28,
        email: "[email protected]",
        city: "San Francisco",
        job: "Data Scientist"
    },
    {
        name: "Mike Johnson",
        age: 35,
        email: "[email protected]",
        city: "Chicago",
        job: "Product Manager"
    }
])

Lassen Sie uns nun die Projektion verwenden, um nur bestimmte Felder auszuwählen. Um Felder einzuschließen, verwenden Sie 1 im Projektionsdokument:

db.users.find({}, { name: 1, age: 1, _id: 0 });

Beispielausgabe:

[
  { name: 'John Doe', age: 30 },
  { name: 'Jane Smith', age: 28 },
  { name: 'Mike Johnson', age: 35 }
]

Zergliedern wir die Projektion:

  • { name: 1, age: 1, _id: 0 } bedeutet:
    • Schließen Sie das name-Feld ein
    • Schließen Sie das age-Feld ein
    • Exkludieren Sie explizit das _id-Feld (standardmäßig wird _id immer zurückgegeben)

Durch die Verwendung von Projektionen können Sie genau steuern, welche Felder in Ihrer Abfrage zurückgegeben werden, was unnötige Datenübertragungen reduziert und die Abfrageleistung verbessert.

Geben Sie auszuschließende Felder an

In diesem Schritt lernen Sie, wie Sie mithilfe von Projektionen bestimmte Felder aus den Ergebnissen Ihrer MongoDB-Abfragen ausschließen. Mit dieser Technik können Sie unerwünschte Felder aus der Dokumentausgabe entfernen.

Wir werden weiterhin die users-Sammlung verwenden, die wir im vorherigen Schritt erstellt haben. Um Felder auszuschließen, verwenden Sie 0 im Projektionsdokument:

db.users.find({}, { email: 0, city: 0 });

Beispielausgabe:

[
  {
    _id: ObjectId("..."),
    name: 'John Doe',
    age: 30,
    job: 'Software Engineer'
  },
  {
    _id: ObjectId("..."),
    name: 'Jane Smith',
    age: 28,
    job: 'Data Scientist'
  },
  {
    _id: ObjectId("..."),
    name: 'Mike Johnson',
    age: 35,
    job: 'Product Manager'
  }
]

Wichtige Projektionsregeln, die Sie sich merken sollten:

  • Sie können in derselben Projektion keine Einschließung und Ausschließung mischen (außer für _id)
  • _id ist das einzige Feld, das Sie explizit ausschließen können, während andere Felder eingeschlossen werden
  • Mit 0 werden die angegebenen Felder aus dem Abfrageergebnis entfernt

Versuchen wir ein weiteres Beispiel, bei dem mehrere Felder ausgeschlossen werden:

db.users.find({}, { email: 0, city: 0, _id: 0 });

Diese Abfrage wird Dokumente ohne die Felder email, city und _id zurückgeben und nur name, age und job anzeigen.

Mischen Sie Einschließung und Ausschließung

In diesem Schritt lernen Sie die feinen Regeln kennen, die bei der Mischung von Einschließung und Ausschließung in MongoDB-Projektionen gelten. Während MongoDB im Allgemeinen die Mischung von Einschließung und Ausschließung in derselben Projektion nicht erlaubt, gibt es eine besondere Ausnahme für das _id-Feld.

Lassen Sie uns dieses Konzept mit unserer bestehenden users-Sammlung erkunden:

Zunächst versuchen wir ein Beispiel, das die allgemeine Regel demonstriert:

// Dies wird einen Fehler verursachen
db.users.find({}, { name: 1, email: 0 });

Sie werden eine Fehlermeldung sehen, die angibt, dass Sie keine Mischung von Einschließungs- und Ausschließungsprojektionen vornehmen können.

_id ist jedoch ein Sonderfall. Sie können andere Felder einschließen oder ausschließen, während Sie das _id-Feld explizit verwalten:

db.users.find(
  {},
  {
    _id: 0, // Exclude _id
    name: 1, // Include name
    job: 1 // Include job
  }
);

Beispielausgabe:

[
  { name: 'John Doe', job: 'Software Engineer' },
  { name: 'Jane Smith', job: 'Data Scientist' },
  { name: 'Mike Johnson', job: 'Product Manager' }
]

Lassen Sie uns ein weiteres Beispiel mit einer anderen Kombination versuchen:

db.users.find(
  {},
  {
    _id: 0, // Exclude _id
    name: 1, // Include name
    age: 1, // Include age
    email: 0 // Dies würde normalerweise einen Fehler verursachen, aber die _id-Ausnahme erlaubt es
  }
);

Wichtige Erkenntnisse:

  • Sie können keine Mischung von Einschließung und Ausschließung für reguläre Felder vornehmen
  • _id ist das einzige Feld, das explizit eingeschlossen oder ausgeschlossen werden kann, wenn andere Felder projiziert werden
  • Seien Sie immer explizit darüber, welche Felder Sie einschließen oder ausschließen möchten

Projizieren von geschachtelten Feldern

In diesem Schritt lernen Sie, wie Sie geschachtelte Felder in MongoDB-Dokumenten projizieren. Geschachtelte Felder sind Felder innerhalb von eingebetteten Dokumenten oder Arrays, für die ein etwas anderer Ansatz zur Projektion erforderlich ist.

Beginnen wir zunächst, unsere users-Sammlung mit komplexeren, geschachtelten Dokumenten zu aktualisieren:

// Clear existing documents
db.users.deleteMany({});

// Insert documents with nested structures
db.users.insertMany([
  {
    name: "John Doe",
    contact: {
      email: "[email protected]",
      phone: {
        mobile: "123-456-7890",
        work: "987-654-3210"
      }
    },
    skills: ["JavaScript", "MongoDB", "React"]
  },
  {
    name: "Jane Smith",
    contact: {
      email: "[email protected]",
      phone: {
        mobile: "234-567-8901",
        work: "876-543-2109"
      }
    },
    skills: ["Python", "Data Science", "Machine Learning"]
  }
]);

Um geschachtelte Felder zu projizieren, verwenden Sie die Punktnotation:

// Project specific nested fields
db.users.find(
  {},
  {
    name: 1,
    "contact.email": 1,
    "contact.phone.mobile": 1,
    _id: 0
  }
);

Beispielausgabe:

[
  {
    name: 'John Doe',
    contact: {
      email: '[email protected]',
      phone: { mobile: '123-456-7890' }
    }
  },
  {
    name: 'Jane Smith',
    contact: {
      email: '[email protected]',
      phone: { mobile: '234-567-8901' }
    }
  }
]

Sie können auch Arrayfelder projizieren:

// Project first two skills
db.users.find(
  {},
  {
    name: 1,
    skills: { $slice: 2 },
    _id: 0
  }
);

Beispielausgabe:

[
  {
    name: 'John Doe',
    skills: ['JavaScript', 'MongoDB']
  },
  {
    name: 'Jane Smith',
    skills: ['Python', 'Data Science']
  }
]

Wichtige Punkte zur Projektion von geschachtelten Feldern:

  • Verwenden Sie die Punktnotation, um auf geschachtelte Felder zuzugreifen
  • Sie können tief geschachtelte Felder projizieren
  • Für Arrays können Sie $slice verwenden, um die Anzahl der zurückgegebenen Elemente zu begrenzen

Formatieren von Ausgabefeldern

In diesem Schritt lernen Sie, wie Sie Ausgabefelder mithilfe von MongoDB's Projektion und Aggregationstechniken formatieren und transformieren. Wir werden Möglichkeiten zur Umbenennung, Berechnung und Modifizierung von Feldern während der Projektion erkunden.

Beginnen wir zunächst, unsere users-Sammlung mit detaillierteren Informationen zu aktualisieren:

// Clear existing documents
db.users.deleteMany({});

// Insert documents with more complex data
db.users.insertMany([
  {
    name: "John Doe",
    age: 30,
    salary: 75000,
    department: "Engineering"
  },
  {
    name: "Jane Smith",
    age: 28,
    salary: 85000,
    department: "Data Science"
  },
  {
    name: "Mike Johnson",
    age: 35,
    salary: 95000,
    department: "Management"
  }
]);

Verwenden Sie den $-Operator, um Felder während der Projektion umzubenennen:

db.users.find(
  {},
  {
    fullName: "$name",
    yearsOld: "$age",
    annualSalary: "$salary",
    _id: 0
  }
);

Beispielausgabe:

[
  { fullName: 'John Doe', yearsOld: 30, annualSalary: 75000 },
  { fullName: 'Jane Smith', yearsOld: 28, annualSalary: 85000 },
  { fullName: 'Mike Johnson', yearsOld: 35, annualSalary: 95000 }
]

Sie können auch Berechnungen mit den $-Aggregationoperators durchführen:

db.users.aggregate([
  {
    $project: {
      name: 1,
      monthlySalary: { $divide: ["$salary", 12] },
      salaryTier: {
        $switch: {
          branches: [
            { case: { $lt: ["$salary", 80000] }, then: "Junior" },
            { case: { $gte: ["$salary", 80000] }, then: "Senior" }
          ],
          default: "Unknown"
        }
      },
      _id: 0
    }
  }
]);

Beispielausgabe:

[
  {
    name: 'John Doe',
    monthlySalary: 6250,
    salaryTier: 'Junior'
  },
  {
    name: 'Jane Smith',
    monthlySalary: 7083.333333333333,
    salaryTier: 'Senior'
  },
  {
    name: 'Mike Johnson',
    monthlySalary: 7916.666666666667,
    salaryTier: 'Senior'
  }
]

Wichtige Punkte zur Formatierung von Ausgabefeldern:

  • Verwenden Sie $, um Felder während der Projektion umzubenennen
  • Die Aggregationspipeline ermöglicht komplexe Feldtransformationen
  • Sie können Berechnungen durchführen und bedingte Felder erstellen
  • Die $project-Stufe ist für die Feldformatierung leistungsfähig

Zusammenfassung

In diesem Lab werden Sie lernen, wie Sie die Projektionsfunktion von MongoDB verwenden, um bestimmte Felder bei der Abfrage von Dokumenten auszuwählen oder auszuschließen. Sie beginnen damit, nur die Felder auszuwählen, die Sie benötigen, erkunden dann das Ausschließen unerwünschter Felder und kombinieren schließlich Einschließung und Ausschließung, um die Ausgabe zu personalisieren. Darüber hinaus werden Sie lernen, wie Sie geschachtelte Felder projizieren und die Ausgabe formatieren. Diese Techniken ermöglichen es Ihnen, die von Ihren Abfragen zurückgegebenen Daten zu steuern, was die Leistung verbessert und den unnötigen Datentransfer reduziert.