2014-07-07 10 views
14

Próbuję zaktualizować dokument w kolekcji (jednostki) przy użyciu interfejsu GUI, a po aktualizacji jest aktualizowany Chcę zaktualizować wartość (user.Units, który jest tablicą nazw jednostek) w kolekcji (użytkownicy). Jeśli długość tablicy to tylko 1 element, to jest ona aktualizowana, a także pojawia się w bazie danych i wszystko działa dobrze, ale kiedy Tablica Jednostek ma więcej niż jeden element, próbuję zaktualizować ją za pomocą pętli for, pokazuje, że jest aktualizowana, ale kiedy Sprawdzam bazę danych, która wciąż nie jest aktualizowana.Zapisywanie Mongoose() nie aktualizowanie wartości w tablicy w dokumencie bazy danych

Naprawdę nie mogę zrozumieć, dlaczego nie aktualizuje bazy danych, gdy aktualizuję wartość przez pętlę.

Cały Edycja i zmiana funkcji: -

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' 
} 

Schema użytkownika: -

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

Czy możesz edytować pytanie, dołączając definicję schematu dla "użytkownika"? – JohnnyHK

Odpowiedz

41

maja być zawiadomić mongooose zestaw danych został zmieniony tak:

doc.markModified('pathToYourAttribute')  

Od docs http://mongoosejs.com/docs/schematypes.html

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

nadzieję, że to pomoże!

+1

Co byłoby "PathToYourAttribute"., Przepraszam jestem trochę nowy w mangusta. –

+0

@SulemanMirza Edytuję odpowiedź, biorę ją od doc. – cvng

+0

@SulemanMirza Dlaczego tak się dzieje? W podobnej sytuacji. –

3

Patrz . Jednym ze sposobów rozwiązania tego problemu nie byłoby zaktualizowanie tablicy za pomocą klasycznej metody indeksowania tablic. Więc zrób to

doc.array.set(index, value); 

Zamiast

doc.array[index] = value; 

również zobaczyć FAQ i doc więcej szczegółów.

+0

to nie działa dla tablicy obiektów, co jest sytuacją PO. jakieś modyfikacje? – Doa

+0

to działało dla mnie – Mark

Powiązane problemy