2013-10-02 17 views
5

Chcesz upsert właściwości obiektów w tablicy dokumentuMongoDB upsert w aktualizacji element tablicy

Rozważmy dokument w zbiorach m

{ "_id" : ObjectId("524bfc39e6bed5cc5a9f3a33"), 
"x" : [  
    { "id":0.0, "name":"aaa"},{ "id":1.0, "name":"bbb"} 
] 
} 

Chcesz dodać age:100 do { "id":0.0, "name":"aaa"}. Nie tylko wiek .. Ale także przepis na upsert w elemencie tablicy {}. Więc może zawierać {age:100,"city":"amd"} (ponieważ jestem coraz to od serwisu aplikacyjnego)

próbował ... Ale to nie działało jak wymienić cały element tablicy

db.m.update({_id:ObjectId("524bfc39e6bed5cc5a9f3a33"), 
    "x" : { 
       "$elemMatch" : { 
         "id" : 0.0 
       } 
}}, 
{ 
     $set : { 
       "x.$" : { 
        "age": 100 
      } 
     } 
}, 
{upsert: true} 
) 

zmienił dokument (który nie chciałem)

{ "_id" : ObjectId("524bfc39e6bed5cc5a9f3a33"), 
    "x" : [  
     { "age":100},{ "id":1.0, "name":"bbb"} 
    ] 
    } 

Jest to możliwe bez zmiany schematu.

Odpowiedz

5
$set : {"x.$" : {"age": 100}} 

x.$ ustawia całą dopasowanego elementu tablicy do {age: 100}

To powinno działać:

db.m.update({_id:ObjectId("524bfc39e6bed5cc5a9f3a33"), 
"x.id": 0.0}, {$set: {"x.$.age": 100 }}); 

Korzystanie elemMatch:

db.test.update({x: {$elemMatch: {id: 1}}},{$set: {"x.$.age": 44}}) 

Należy pamiętać, że opcja upsert tutaj jest zbędne i nie chciałbym ork, jeśli id nie jest obecny w x, ponieważ operator pozycyjny $ nie obsługuje upserting.

+0

Wiem, że to działa. Ale pytam, czy db.test.update ({x: {$ elemMatch: {id: 1}}}, {$ zestaw: {"x. $": {"A": 100, "b": 200, "wiek": 44}}}) działałby ?? Lub coś podobnego działa. Uwaga {"a": 100, "b": 200, "wiek": 44} może być obiektem i powinien "wstawiać" wartości w dopasowanym elemencie tablicy. – andNn

+0

Tak, ale ** zastąp ** cały dopasowany element nowym dokumentem: '{" a ": 100," b ": 200," wiek ": 44}". I nie może "upsert" wartości, ponieważ 'upsert' jest wykonywane tylko wtedy, gdy nie znaleziono dopasowania (element w' x' nie występuje z podanym 'id'). –

+0

>> W górę jest wykonywane tylko wtedy, gdy nie znaleziono dopasowania, nah! Właściwości dopasowanych dokumentów są aktualizowane/wstawiane – andNn

0

Nie jest to możliwe bez zmiany schematu. Jeśli możesz zmienić schemat, aby użyć obiektu do przechowywania przedmiotów (a nie do tablicy), możesz postępować zgodnie z podejściem opisanym w this answer.