2017-01-06 67 views
5

Chcę zaktualizować wartość tablicy, ale nie jestem pewien co do właściwej metody to zrobić, więc dla próbowałem następujące metody, ale nie pracował dla mnie.Jak zaktualizować wartość tablicy w Mongoose

Mój model, Pole dzieci w moim modelu

childrens: { 
     type: Array, 
     default: '' 
    } 

mojej kwerendy,

Employeehierarchy.update({ _id: employeeparent._id} ,{ $set: {"$push": { "childrens": employee._id }} }) 
    .exec(function (err, managerparent) {}); 

Może ktoś proszę podać mi help.Thanks.

Odpowiedz

10

Nie można używać zarówno $set i $push w tym samym wyrażeniu Update jako zagnieżdżonych operatorów.

Poprawna składnia pomocą update operators następująco:

{ 
    <operator1>: { <field1>: <value1>, ... }, 
    <operator2>: { <field2>: <value2>, ... }, 
    ... 
} 

gdzie <operator1>, <operator2> może być z dowolnego z listy operatorów aktualizacyjne określone here.

Aby dodać nowy element do tablicy, wystarczy jeden operator, na przykład $push. można użyć metody findByIdAndUpdate aktualizacji do powrotu zmodyfikowanego dokumentu jako

Employeehierarchy.findByIdAndUpdate(employeeparent._id, 
    { "$push": { "childrens": employee._id } }, 
    { "new": true, "upsert": true }, 
    function (err, managerparent) { 
     if (err) throw err; 
     console.log(managerparent); 
    } 
); 

Używanie oryginalnego update() metody, składnia jest

Employeehierarchy.update(
    { "_id": employeeparent._id}, 
    { "$push": { "childrens": employee._id } }, 
    function (err, raw) { 
     if (err) return handleError(err); 
     console.log('The raw response from Mongo was ', raw); 
    } 
); 

w których funkcja callback odbiera argumenty (err, raw) gdzie

  • err jest błąd jeśli wystąpił
  • raw to pełna odpowiedź z Mongo

Skoro chcesz sprawdzić zmodyfikowany dokument, polecam użyć funkcji findByIdAndUpdate od sposobu update() nie dostarczy ci zmodyfikowanego dokumentu, tylko pełny wynik zapisu od mongo.


Jeśli chcesz zaktualizować pola w dokumencie i dodać element do tablicy w tym samym czasie to można zrobić

Employeehierarchy.findByIdAndUpdate(employeeparent._id, 
    { 
     "$set": { "name": "foo" }, 
     "$push": { "childrens": employee._id } 
    } 
    { "new": true, "upsert": true }, 
    function (err, managerparent) { 
     if (err) throw err; 
     console.log(managerparent); 
    } 
); 

Powyższy zaktualizuje pola name do „foo” i dodaj identyfikator pracownika do tablicy childrens.

+0

Jeśli mogę przetestować Print Manager console.log (managerparent + 'kk') otrzymuję błąd jak uncaughtException: managerparent nie jest zdefiniowana – MMR

+0

Thsnks chridam to wrkd. – MMR

+0

nadal mam jeszcze jedno pytanie dla ciebie :), jeśli wszystko w porządku. – MMR

2

może obserwować ten

jeśli childrens zawiera wartości ciągów następnie model może być tak:

childrens: [{ 
    type : String 
}] 

jeśli childrens zawiera objectID wartości innej kolekcji _id i chcą zapełnić następnie model może być tak:

childrens: [{ 
    type : mongoose.Schema.Types.ObjectId, 
    ref: 'refModelName' 
}] 

nie trzeba używać $set po prostu użyć $push do wstaw wartość w tablicy childrens. Zapytanie może być tak jak:

Employeehierarchy.update(
    { _id: employeeparent._id}, 
    {"$push": { "childrens": employee._id } } 
).exec(function (err, managerparent) { 
    // 
}); 
+0

I model jest zadeklarowany, więc może stać się tablicą obiektów? Którego nie chcę – MMR

+0

nie tablica obiektu będzie tablica, która będzie zawierała identyfikatory (jako ciąg dla pierwszego procesu i dla drugiego procesu jako ObjectId) @nlr_p –

+0

Ok Thaks Shaishab Roy. – MMR