ich mit mongoosejs 4.9.5 und 3.2.7 mongo eine Geschichte der Staaten in einem Subdokument Array zu halten bin versucht
Beispiel für Dokumentstruktur:
- Firma (Schema)
- Mitarbeiter (Schema): []
- current: String
- Staaten (Schema): []
- Zustand: String
- beginnt: Datum
- Enden: Datum
Wenn ich die Mitarbeiter ihren Zustand ändern , Ich möchte den currentState ändern, den neuen Zustand in das states-Array einfügen und die letzten s aktualisieren tate für definieren die ‚Enden‘ Zeitstempel
// I get the last state position from a previous find request
var lastStateIndex = employee.stateHistory.length - 1;
var changeStateDate = new Date();
// Prepare the update
var query = { _id: companyId, "employees._id": employeeId };
var update = {
$set: {
"employees.$.state": newState,
`employees.$.stateHistory.${lastStateIndex}.ends`: changeStateDate
},
$push: {
"employees.$.stateHistory": {
state: newState,
starts: changeStateDate
}
}
}
Company.findOneAndUpdate(query, update, { multi:false, new:true}, ...)
Mongo zurückkehrt, wird folgende Fehler
{"name":"MongoError","message":"Cannot update 'employees.0.stateHistory.0.ends' and 'employees.0.stateHistory' at the same time","ok":0,"errmsg":"Cannot update 'employees.0.stateHistory.0.ends' and 'employees.0.stateHistory' at the same time","code":16837}
- Irgendwelche Vorschläge, wie zu diesem Zweck laufen zwei Updates zu vermeiden?
- Irgendwelche Arbeiten um zu vermeiden, das 'Ende'-Datum zu speichern, aber in der Lage zu sein, es basierend auf den' Starts 'des nächsten Elements im Array zu berechnen?
Danke,
Es ist der '' stateHistory '' Teil natürlich. Es gibt "keine Reihenfolge" für die Anwendung von Operationen in einer Aktualisierungsanweisung. Sie können also den gleichen Pfad nicht ändern. Sie sollten stattdessen '.bulkWrite()' verwenden und die $ set und $ push auf dem "gleichen Pfad" in zwei separaten Operationen ausgeben. Sie müssen getrennt sein, aber was "Bulk" tut, wird als ** eine ** Anfrage mit ** einer ** Antwort gesendet, im Gegensatz zu "mehreren" von jedem. –
Danke Neil, wirklich appreaciate es! –