Versuchen zu entfernen ein Filialdokument in Mungo gibt mir eine innere Mungo Fehler
Habe ich ein schema wie folgt aus (vereinfacht):
var Permission = new Schema({
_id: String, //email address
role: String //"admin" or "member"
});
var Org = new Schema({
name: {type: String, index: {unique: true, dropDups: true}, trim: true},
permissions: [Permission]
});
Ein Beispiel-Dokument würde folgendermaßen Aussehen:
{
"name": "My Org",
"permissions" : [
{"_id" : "[email protected]", "role" : "admin"},
{"_id" : "[email protected]", "role" : "member"}
]
}
Ich versuche zu löschen-Berechtigungen Zeilen mit dem Befehl org.permissions.remove(req.params.email)
, wie im Rahmen unten:
exports.removePermissions = function(req, res) {
var name = req.params.name;
return Org
.findOne({name: name})
.select()
.exec(function(err, org) {
if (err) return Org.handleError(res, err);
if (!org) return Org.handleError(res, new Error("#notfound " + name));
org.permissions.remove(req.params.email);
org.save(function(err, org) {
if (err) return Org.handleError(res, err);
else return res.send(org);
});
});
};
Wenn ich dies mache, bekomme ich die folgende Fehlermeldung:
TypeError: Cannot use 'in' operator to search for '_id' in joe@gmail.com
at EmbeddedDocument.Document._buildDoc (/../node_modules/mongoose/lib/document.js:162:27)
at EmbeddedDocument.Document (/../node_modules/mongoose/lib/document.js:67:20)
at EmbeddedDocument (/../node_modules/mongoose/lib/types/embedded.js:27:12)
at new EmbeddedDocument (/../node_modules/mongoose/lib/schema/documentarray.js:26:17)
at MongooseDocumentArray._cast (/../node_modules/mongoose/lib/types/documentarray.js:62:10)
at Object.map (native)
at MongooseDocumentArray.MongooseArray.remove (/../node_modules/mongoose/lib/types/array.js:360:21)
at model.Org.methods.removePermissions (/../models/org.js:159:20)
Das einzige was ich mir vorstellen kann ist, dass Mongoose nicht unterstützt _id Felder, die nicht ObjectID ' s? Das ist seltsam, weil ich diese an anderer Stelle in meinem code, und es funktioniert gut (z.B. org.die Berechtigungen.id("[email protected]") Werke).
Anregungen sehr willkommen!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht sicher, warum
remove
es nicht funktioniert, aber Sie können dies tun, atomar mitfindOneAndUpdate
und die$pull
Betreiber:$pull
- operation erfolgreich war, d.h. wenn es ein Permission-Objekt in der DB entfernt wurde. Für diese Ebene der error-checking, würden Sie brauchen, um es in zwei Schritten mitfindById
dann den Betrieb auf die daraus resultierenden zurückgegebenorg
.Als pro diese Antwort, müssen Sie rufen Sie
remove()
auf das Filialdokument, das Sie entfernen möchten, anstatt auf das gesamte Filialdokument array.So ändern:
zu:
Dieser zwei-Schritt-Methode hat den zusätzlichen Vorteil, dass über die Antwort geliefert von @JohnnyHK, dass Sie überprüfen können, ob Sie das Filialdokument tatsächlich existiert, bevor Sie Sie entfernen. Dies kann nützlich sein, wenn Sie möchten, senden Sie eine 404-Antwort, die angibt, dass das Filialdokument nicht vorhanden - soweit ich informiert bin, ist es nicht möglich mit dem $ - pull-atomic-Betreiber.
Beachten Sie, dass dies auch nur funktioniert, wenn das Filialdokument-array hat ein schema, wie abgebildet, in Frage. Wenn es nicht, oder es hat eine schema-Typ von
Mixed
die Sammlung von der Datenbank zurückgegeben wird ein einfaches array, anstatt ein Mungo-enhanced array. Dies bedeutet, dass es keine.id()
Funktion. In diesem Fall würde ich lodash#entfernen statt:org.save()
.