2 Stimmen

Aktualisieren Sie das Feld im Unterdokument Mongoose

Mein Elternmodell

var GameChampSchema = new Schema({
  name: String,
  gameId: { type: String, unique: true },
  status: Number,
  countPlayers: {type: Number, default: 0},
  companies: [
    {
      name: String,
      login: String,
      pass: String,
      userId: ObjectId
    }
  ],
  createdAt: {type: Date, default: Date.now},
  updateAt: Date
})

Ich muss die userId-Eigenschaft im ersten Kind einfügen, wenn sie nicht gesetzt ist

Also, diese Aktion ist nur auf die Eltern mit Bedingung ({status: 0, countPlayers: { $lt: 10 })

3voto

Neil Lunn Punkte 141609

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.

0voto

Maksim Borodov Punkte 419

Großer Dank.

Ich habe sein Problem gelöst

exports.joinGame = function(req, res) {
  winston.info('Start-Methode');
  winston.info('Header-Inhaltstyp: %s', req.headers['content-type']);

  //  
  var currentUser  = service.getCurrentUser(req);
  winston.info('Aktueller Benutzername %s', currentUser.username);
  //    
  var gameQuery = {"status": 0, "close": false};
  gameChamp.findOne(gameQuery, {}, {sort: {"createdAt": 1 }}, function(error, game) {
    if (error) {
      winston.error('Fehler %s', error);
      res.send(error);
    }
    //  
    if (game) {
      winston.info('Aktuellen Benutzer zum Spiel hinzufügen: %s', game.name);
      // Benutzer-ID    
      var updateFlag = false;
      for (var i=0; i

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X