MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie kann man mongoDB-bezogene Probleme effizient lösen?

Es gibt ein paar Regeln, die hier helfen, gute und wertvolle Antworten auf MongoDB-bezogene Fragen zu erhalten.

Nachfolgend finden Sie einige allgemeine Kategorien und Schritte, die beim Sammeln von Daten helfen, die Ihnen helfen könnten, schneller eine gute Antwort zu finden.

Bitte hängen Sie alle Dokumente im Textformat an, da Screenshots nicht in den Editor eingefügt werden können :-)

  1. Grundlagen - da sich MongoDB weiterentwickelt, sind einige coole Funktionen in höheren Versionen verfügbar - um Verwirrung zu vermeiden, geben Sie bitte Ihre aktuelle Mongo-Version an und teilen Sie uns mit, ob es sich um ein eigenständiges System, ein Replikat-Set oder eine Sharding-Umgebung handelt

  2. Fragen zur Leistung:

    • Bitte geben Sie die Ausgabe der Ausführungsstatistik an - für Abfragen:db.collection.find({query}).explain("executionStats") - das gibt einige Statistiken über Abfragen, Indizes, für das Aggregationsframework:db.collection.aggregate([{pieplineDatausedToExecuteAggregation},{explain:true}])
    • Hardware-Spezifikationen wie SSD, RAM-Größe, CPU-Nr. und sogar Taktfrequenz, falls bekannt
  3. Datenmanipulation - Da Abfragen auf der Dokumentstruktur basieren, stellen Sie bitte einen gültigen Dokument-Dump (oder sogar mehr als einen) bereit und stellen Sie sicher, dass mocked Felder spiegeln Felder in der Abfrage wider. Manchmal können wir beim Versuch, eine Abfrage zu erstellen, keine Beispieldokumente einfügen, da ihre Struktur nicht gültig ist. Auch wenn Sie ein bestimmtes Ergebnis am Ende des Prozesses p erwarten, fügen Sie bitte das erwartete Beispiel bei.

  4. Probleme mit dem Replikatsatz/Sharding – bitte fügen Sie rs.config() hinzu / sh.status() und Hostdaten entfernen (falls vertraulich)

  5. Wenn Sie eine treiber-/frameworkspezifische Frage haben, zeigen Sie bitte an, was getan wurde und wo Sie das Problem haben. Manchmal ist es sehr schwierig, Abfragen von der Mongo-Shell-Syntax in die Treiber-/Framework-Syntax zu übersetzen – wenn Sie also versuchen könnten, diese Abfrage in der MongoDB-Shell zu erstellen – und ein laufendes Beispiel haben – fügen Sie sie bitte der Frage hinzu.

Beispiele:

RE:1

Wenn ich Mongo 2.6 auf einem Windows-Laptop verwende, kann ich keine Sammlung von mehr als 2 GB haben, warum?

RE:2

Meine Abfrage db.collection.find({isValid:true}) dauert länger als 30 Sekunden, siehe Ausgabe erklären:

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.collectionName",
        "indexFilterSet" : false,
        "parsedQuery" : {},
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "direction" : "forward"
        },
        "rejectedPlans" : []
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 6,
        "executionTimeMillis" : 0,
        "totalKeysExamined" : 0,
        "totalDocsExamined" : 6,
        "executionStages" : {
            "stage" : "COLLSCAN",
            "nReturned" : 6,
            "executionTimeMillisEstimate" : 0,
            "works" : 8,
            "advanced" : 6,
            "needTime" : 1,
            "needYield" : 0,
            "saveState" : 0,
            "restoreState" : 0,
            "isEOF" : 1,
            "invalidates" : 0,
            "direction" : "forward",
            "docsExamined" : 6
        }
    },
    "serverInfo" : {
        "host" : "greg",
        "port" : 27017,
        "version" : "3.3.6-229-ge533634",
        "gitVersion" : "e533634d86aae9385d9bdd94e15d992c4c8de622"
    },
    "ok" : 1.0
}

RE:3

Ich habe Probleme, die letzten 3 Array-Elemente aus jedem Datensatz in meiner Aggregationspipeline, Mongo 3.2.3

, abzurufen

meine Abfrage:db.collection.aggregate([{aggregation pipeline}])

Dokumentschema:

{
    "_id" : "john",
    "items" : [{
            "name" : "John",
            "items" : [{
                    "school" : ObjectId("56de35ab520fc05b2fa3d5e4"),
                    "grad" : true
                }
            ]
        }, {
            "name" : "John",
            "items" : [{
                    "school" : ObjectId("56de35ab520fc05b2fa3d5e5"),
                    "grad" : true
                }
            ]
        }, {
            "name" : "John",
            "items" : [{
                    "school" : ObjectId("56de35ab520fc05b2fa3d5e6"),
                    "grad" : true
                }
            ]
        }, {
            "name" : "John",
            "items" : [{
                    "school" : ObjectId("56de35ab520fc05b2fa3d5e7"),
                    "grad" : true
                }
            ]
        }, {
            "name" : "John",
            "items" : [{
                    "school" : ObjectId("56de35ab520fc05b2fa3d5e8"),
                    "grad" : true
                }
            ]
        }
    ]
}

//expected result

{
    "_id" : "john",
    "items" : [{
            "name" : "John",
            "items" : [{
                    "school" : ObjectId("56de35ab520fc05b2fa3d5e4"),
                    "grad" : true
                }
            ]
        }, {
            "name" : "John",
            "items" : [{
                    "school" : ObjectId("56de35ab520fc05b2fa3d5e5"),
                    "grad" : true
                }
            ]
        }, {
            "name" : "John",
            "items" : [{
                    "school" : ObjectId("56de35ab520fc05b2fa3d5e6"),
                    "grad" : true
                }
            ]
        }
    ]
}

RE:4

Ich habe Probleme mit meinem Replikatsatz, Daten werden mit Mongo 3.2 nicht auf andere Server repliziert, unter rs.config dump:

   {
       "_id" : "rs0",
       "version" : 1,
       "members" : [
          {
             "_id" : 1,
             "host" : "mongodb0.example.net:27017"
          }
       ]
    }

RE:5

Ich habe eine Aggregationsabfrage in Mongo und habe Probleme, ein typisiertes Ergebnis von c# zu erhalten Fahrer

startDate = new Date() // Current date
startDate.setDate(startDate.getDate() - 7) // Subtract 7 days

db.collection.aggregate([{
            $match : {
                LastUpdate : {
                    $gte : startDate
                }
            }
        }, {
            $sort : {
                LastUpdate : -1
            }
        }, //sort data
        {
            $group : {
                _id : "$Emp_ID",
                documents : {
                    $push : "$$ROOT"
                }
            }
        }, {
            $project : {
                _id : 1,
                documents : {
                    $slice : ["$documents", 3]
                }
            }
        }
    ])

mein C#-Code

public static void Main()
{
    var client = new MongoClient("mongodb://localhost:27017");
    var database = client.GetDatabase("test");

    var collection = database.GetCollection<InnerDocument>("irpunch");


    var aggregationDocument = collection.Aggregate()
        .Match(x=>x.LastUpdate> DateTime.Now.AddDays(-40))
        .SortByDescending(x => x.LastUpdate)
        .Group(BsonDocument.Parse("{ _id:'$Emp_ID', documents:{ '$push':'$$ROOT'}}"))
        // how to get projection result as typed object ??
        .Project(BsonDocument.Parse("{ _id:1, documents:{ $slice:['$documents', 3]}}")).ToList();


    }
}

Viel Spaß beim Fragen!