2016-08-03 13 views
2

Ich bin eine Anwendung erstellen, und es hat eine Funktion, die Elemente aus einem Array in einem Dokument in einer MongoDB-Sammlung entfernt.Count Anzahl der Elemente in einem Array

Ich brauche eine Möglichkeit, das Array-Feld zu deaktivieren, sobald das Array direkt nach einem Entfernen-Vorgang leer wird. Ich muss das tun, damit ich zwischen einem Dokument unterscheiden kann, das ein nicht leeres Feld hat, und einem Dokument, das ein leeres Feld hat.

Zum Beispiel gerade jetzt meine section Sammlung wie folgt aussieht:

db.section.find({}) 

{ "_id" : ObjectId("57a0a38ad1c6ef24376477c5"), "sectionid" : "BTE4B", 
"sectionname" : "BTech 4B", "year" : 4, 
"session" : 2016, "courseid" : "BTE-CS", "password" : "pm8xTE0-", 
"students" : 35, "addedon" : "2016-08-02 19:13:38", "teachers" : [ ] } 

{ "_id" : ObjectId("57a0a96bd1c6ef24376477cd"), "sectionid" : "BTE4D", 
"sectionname" : "BTech 4D", "year" : 4, "session" : 2016, "courseid" : 
"BTE-CS", "password" : "sHhKr0Ov", "students" : 41, "addedon" : 
"2016-08-02 19:38:43", "teachers" : [ { "facultyid" : "CS-102", 
"subjectid" : "CS-ALGO" } ] } 

ich ein $ zieht Betrieb mit mgo auf dem teachers Array des ersten Dokuments angelegt hatte, aber ich brauche einen Weg $unset es wenn es leer wird.

Derzeit habe ich es geschafft, eine Problemumgehung in Go zu erstellen, aber ich möchte ohne jede Umgehungslösung wegkommen.

Ich hoffe, dass ich hier nicht etwas sehr Triviales verpasse.

Dank!

+0

Sie möchten "Lehrer" -Array zusammen mit $ Pull Operation in einer Abfrage entfernen oder zwei Abfragen verwenden? – Shrabanee

+0

Ich brauche einen Weg in 'mgo', um herauszufinden, dass das' Lehrer'-Array dieser bestimmten Sectionid (auf dem die Remove-Operation ausgeführt wurde) gleich nach einer remove-Funktion leer ist oder nicht. Vielleicht eine Funktion, die 'mgo' bereitstellt, mit der ich die Größe des Arrays bestimmen kann, und wenn die zurückgegebene Größe 0 ist, kann ich '$ unset' aufrufen (noch einmal mit mgo). Aber, wenn vorhanden, einige andere elegante Lösung ist auch willkommen :) –

Antwort

1

Würde vorschlagen, die findAndModify() API unter Verwendung des $pull Update-Vorgang zu tun, zuerst das wird das geänderte Dokument zurück, die Sie dann die Lehrer-Array für die Überprüfung zugreifen können. Sobald Sie die Array-Leerheit überprüft haben, können Sie einen weiteren Aktualisierungsvorgang ausführen, der den Operator $unset im Lehrerfeld aufruft, wenn der Array-Schlüssel null Elemente enthält.

Eine kanonische Beispiel in mongo Schale folgt:

change = db.section.findAndModify({ 
    query: { "sectionid": "BTE4D", "teachers.facultyid": "CS-102" }, 
    update: { "$pull": { "teachers": { "facultyid" : "CS-102" } } }, 
    new: true 
}); 

printjson(change); 

if (!change.teachers[0]) { 
    db.section.update(
     { "_id": change._id }, 
     { "$unset": { "teachers": "" } } 
    ); 
} 

db.section.find({ "_id": change._id }) 

Implementierung dieses mit MgO, müssen Sie das Query.Apply Verfahren, die im wesentlichen den Befehl findAndModify MongoDB Wraps

change := mgo.Change{ 
     Update: bson.M{"$pull": bson.M{"teachers": bson.M{"facultyid": "CS-102"}}}, 
     ReturnNew: true, 
} 
info, err = col.Find(M{"sectionid": "BTE4D"}).Apply(change, &doc) 
fmt.Println(doc.N) 
+1

Danke, das ist, was ich gesucht habe. –

1

Um leere Arrays von Nicht-Em zu unterscheiden Sie können den Befehl find mit dem Operator $size verwenden.

Wenn Sie wählen, um leere Arrays entfernen Sie $ Pull-Operator mit MongoDB ausgeben kann findAndModify (siehe die mgo documentation für weitere Details), die atomar geänderte Dokument zurückkehren können, prüfen Sie, ob das Array mit einer anderen Abfrage leer und nicht gesetzt ist.