2014-07-07 11 views
14

Ich versuche ein Dokument in einer Sammlung (Einheiten) mit GUI zu aktualisieren und nachdem es aktualisiert wird Ich möchte den Wert (user.Units, die ein Array ist zu aktualisieren) von Unit-Namen) in der Sammlung (Benutzer). Wenn die Array-Länge nur 1 Element ist, wird es aktualisiert und erscheint auch in der Datenbank und alles funktioniert gut, aber wenn Array of Units mehr als ein Element haben, versuche ich es durch eine for-Schleife zu aktualisieren, es zeigt aber, wann es aktualisiert wird Ich überprüfe die Datenbank, die noch nicht aktualisiert wird.Mongoose save() Aktualisiere Wert in einem Array im Datenbankdokument

Ich kann wirklich nicht herausfinden, warum es die Datenbank nicht aktualisiert, wenn ich den Wert durch eine Schleife aktualisiere.

Ganze bearbeiten und Update-Funktion: -

edit_unit: function (req, res, next) { 
    var Data = req.body; 

    Client_data.Unit.findById(req.params.unitId, function (err, unit) { 
     var error = false; 
     if (err) { 
      error = err; 
     } else if (!unit) { 
      error = "FATAL: unable to look up Unit #" + req.params.unitId; 
     } else { 

      switch(req.body.name) { 
       case 'Icon': 
        var Icon = unit.Icon; 

        User.find({"Units":Icon}, function (err, users) { 
         if (err) 
         console.log(err); 

         users.forEach(function (u) { 
          if (u.Units.length > 1) { 
          for (var i = 0; i <= u.Units.length; i++) { 
           if(u.Units[i] == Icon) { 
            u.Units[i] = req.body.value; 
           } 
          } 
          } 
          else { 
           u.Units = req.body.value; 
          } 
          u.save(u); 
         }); 
        }); 
        unit[req.body.name] = req.body.value; 
        break; 
       case 'Description': 
        unit[req.body.name] = req.body.value; 
        break; 
       default: 
        unit[req.body.name] = req.body.value; 
        break; 
      } 
      var data = JSON.stringify(req.body); 
      unit.save(); 

      res.writeHead(200, { 
       'Content-Length': data.length, 
       'Content-Type': 'application/json' 
      }); 
      res.end(data); 
     } 
    }); 
} 

req.body: -

{ name: 'Icon', 
    value: 'Health Utility 22c', 
    pk: '5395ed107cd92dc40eaafb56' 
} 

Benutzer Schema: -

var userSchema = mongoose.Schema({ 
UserName:  { type: String, required: true }, 
Password:  { type: String }, 
FirstName: { type: String, required: true }, 
LastName:  { type: String, required: true }, 
CompanyName: { type: String }, 
PhoneNumber: { type: Number }, 
StartDate: { type: Date, required: true }, 
EndDate:  { type: Date, required: true, default: new Date('9999-12-12') }, 
ClientID:  { type: ObjectId, ref: 'Client', default: null }, 
DepartmentID: { type: ObjectId, ref: 'Department' }, 
ManagerID: { type: ObjectId, ref: 'User', default: null}, 
Units:  [ { type: String, required: true } ], 
UserList:  { type: Array, default:[]}, 
Access: [{ type: String, enum: ['DEMO', 'USER','MANAGER','ADMINISTRATOR','OWNER']}], 
Credentials: { type: String }, 
AFTE:   { type: Number}, 
SessionID: { type: String, default: null } 
}, { safe: true }); 
+0

Können Sie Ihre Frage bearbeiten, um die Schemadefinition für 'User' einzuschließen? – JohnnyHK

Antwort

41

Mai sein benachrichtigen mongooose der Datensatz hat wie folgt geändert:

doc.markModified('pathToYourAttribute')  

Aus der Dokumentation http://mongoosejs.com/docs/schematypes.html

person.anything = { x: [3, 4, { y: "changed" }] }; 
person.markModified('anything'); 

hoffen, dass es helfen!

+1

Was wäre "PathToYourAttribute".?, Entschuldigung, ich bin etwas neu bei Mungo. –

+0

@SulemanMirza Ich bearbeite meine Antwort, ich nehme es aus dem Dokument – cvng

+0

@SulemanMirza Warum passiert das? In einer ähnlichen Situation. –

3

Siehe this issue. Eine Möglichkeit, dies zu lösen, wäre, das Array nicht über die klassische Array-Indexmethode zu aktualisieren. So tun, um diese

doc.array.set(index, value); 

Statt

doc.array[index] = value; 

auch die FAQ und doc, um weitere Informationen anzuzeigen.

+0

Dies funktioniert nicht für ein Array von Objekten, was die Situation des OP ist. irgendeine Änderung dafür? – Doa

+0

das funktionierte für mich – Mark