Da dies ein eingebettetes Dokument ist, ist es ziemlich einfach:
Wenn Sie ein Dokument aktualisieren möchten, das das erste Element im Array ist und keine userId hat
db.collection.update(
{
"status": 0,
"countPlayers": {"$lt": 10 },
"companies.userId": {"$exists": false }
},
{ "$set": {"companies.$.userId": userId } }
)
Was schön wäre, aber anscheinend entspricht dies nicht der Logik, wie MongoDB die Verarbeitung durchführt, und es wird berücksichtigt, dass nichts übereinstimmt, wenn im Array etwas vorhanden ist, das das Feld hat. Sie könnten dieses Element mithilfe des Aggregations-Frameworks abrufen, aber das hilft nicht dabei, die Position zu finden, die wir benötigen.
Ein vereinfachter Vorschlag ist, wenn überhaupt keine Elemente im Array vorhanden sind:
db.collection.update(
{
"status": 0,
"countPlayers": {"$lt": 10 },
"companies.0": {"$exists": false }
},
{ "$push": {"userId": userId } }
)
Und das fügt einfach eine neue Sache in das Array ein.
Das Naheliegende für mich ist, dass Sie tatsächlich etwas über diesen Eintrag wissen und das Feld userId
nur festlegen möchten. Daher würde ich am Login übereinstimmen:
db.collection.update(
{
"status": 0,
"countPlayers": {"$lt": 10 },
"companies.login": login,
},
{ "$set": {"companies.$.userId": userId } }
)
Zum Schluss, wenn es nur darum geht, das erste Element im Array zu aktualisieren, dann müssen wir die Position nicht übereinstimmen, da wir bereits wissen, wo es sich befindet:
db.collection.update(
{
status: 0,
countPlayers: {"$lt": 10 }
},
{ $set: { "companies.0.userId": userId } }
)
Bei meinem logischen Fall, sehen Sie die Dokumentenstruktur:
{
"_id" : ObjectId("530de54e1f41d9f0a260d4cd"),
"status" : 0,
"countPlayers" : 5,
"companies" : [
{ "login" : "neil" },
{ "login" : "fred", "userId" : ObjectId("530de6221f41d9f0a260d4ce") },
{ "login": "bill" },
]
}
Wenn Sie also nach "dem ersten Dokument suchen, in dem keine userId
vorhanden ist", ergibt dies keinen Sinn, da es mehrere Elemente gibt und Sie bereits eine spezifische userId zum Aktualisieren haben. Das bedeutet, Sie meinen eines von ihnen. Wie können wir feststellen, welches? Es scheint nach dem Anwendungsfall, dass Sie die vorhandenen Informationen mit einer userId
basierend auf den Informationen abgleichen möchten, die Sie haben.
Die Logik besagt, suchen Sie nach dem Schlüsselwert
, den Sie kennen, und aktualisieren Sie die übereinstimmende Position.
Ersetzen Sie einfach den Teil db.collection
durch Ihr Model
-Objekt für die Verwendung mit Mongoose.
Lesen Sie die Dokumentation zu $exists, sowie zu $set und $push für weitere Informationen.