2009-07-17 17 views
15

Say mam struktury danych coś takiego:Aktualizacja zagnieżdżone dokumenty MongoDB

{ 
    'name': 'test', 
    'anotherdoc': { 
     'something': 'someval', 
     'somenum': 1 
    } 
} 

Teraz, powiedzmy chciałem ustawić coś. Początkowo chciałbym, aby tak się stało:

collection.update({'_id': myid}, {$set: {'anotherdoc.something': 'somenewval'}); 

To jednak wydaje się nieprawidłowe. Wprowadza tam pewne dane, ale robi to w dziwny sposób. W takim przypadku zakończyłoby się tak:

[ 
    { 
     'name': 'test', 
     'anotherdoc': { 
      'something': 'someval', 
      'somenum': 1 
     } 
    }, 
    ['anotherdoc.something', 'someval'] 
] 

Oczywiście, nie tego szukałem.

Odpowiedz

14

Następujące prace dla mnie z muszli Mongo - więc nie jestem pewien, co się stało powyżej dla Ciebie. Spróbuj tego i sprawdź, czy to działa? Jeśli tak, to chciałbym pobrać najnowszy kod mongo na wypadek, gdyby coś było problematyczne.

x = { 'name': 'test', anotherdoc: { 'something': 'someval', somenum : 1 } } 
> x 
{"name" : "test" , "anotherdoc" : {"something" : "someval" , "somenum" : 1}} 
> collection = db.foo; 
test.foo 
> collection.insert(x) 
> collection.find() 
{"_id" : ObjectId("4a61b6711591f41f0f1bc5ff") , "name" : "test" , "anotherdoc" : {"something" : "someval" , "somenum" : 1}} 
> x 
{"name" : "test" , "anotherdoc" : {"something" : "someval" , "somenum" : 1}} 
> x._id 
> x = collection.findOne() 
{"_id" : ObjectId("4a61b6711591f41f0f1bc5ff") , "name" : "test" , "anotherdoc" : {"something" : "someval" , "somenum" : 1}} 
> collection.update({'_id': x._id}, {$set: {'anotherdoc.something': 'somenewval'}}) 
> collection.find() 
{"_id" : ObjectId("4a61b6711591f41f0f1bc5ff") , "name" : "test" , "anotherdoc" : {"somenum" : 1 , "something" : "somenewval"}} 
> 

Jak wspomniano powyżej, fora MongoDB prawdopodobnie szybciej się zobaczą (lub wypróbują IRC).

+0

hm, zgodnie z prawdą robiłem ten test w Pythonie, a nie w tłumaczu. Jeśli działa z tłumaczem, problem musi tkwić w mojej implementacji tego w pythonie. Będę na forach MongoDB, jeśli nadal nie będę mógł tego zrobić. – defrex

+1

co by było, gdyby 'anotherdoc.something' był typem tablicowym, w jaki sposób wstawiłbym inny element do tego? – Val