2014-01-13 2 views
1

Мой документ выглядит следующим образом:Проблема обновления конкретного поддокумент с MongoDB

{ 
    _id: ObjectId("52d317d7b5c4960000587cd4"), 
    txid: "7e621eeb02874ab039a8566fd36f4591e65eca65313875221842c53de6907d6c", 
    vin: [ 
    { 
     _id: ObjectId("52d317d7b5c4960000587ce9"), 
     meta_address: "321", 
     meta_amount: 50, 
     sequence: 4294967295, 
     txid: "6749762ae220c10705556799dcec9bb6a54a7b881eb4b961323a3363b00db518", 
     vout: 0 
    }, 
    { 
     _id: ObjectId("52d317d7b5c4960000587ce8"), 
     sequence: 4294967295, 
     txid: "c04c413576307737f3ad48efe5d509ebc883e1d04822b3a2eccf6a80a4482932", 
     vout: 0 
    }, 
    { 
     txid: "72d4fc43ac576a4b2f1f35e1b310a2d83a1012a36fdc7813ec237646950233cf", 
     vout: 0, 
     sequence: 4294967295, 
     _id: ObjectId("52d317d7b5c4960000587ce7") 
    } 
    ] 
} 

Мой запрос является: { txid: '7e621eeb02874ab039a8566fd36f4591e65eca65313875221842c53de6907d6c', 'vin.txid': 'c04c413576307737f3ad48efe5d509ebc883e1d04822b3a2eccf6a80a4482932', 'vin.vout': 0 }

и обновление:

{ 'vin.$.meta_address': '321', 
    'vin.$.meta_amount': 50 } 

Но когда я запускаю его, он обновляет первый элемент в массиве vin вместо второго. Теперь, как ни странно, если я сменил запрос на: { txid: '7e621eeb02874ab039a8566fd36f4591e65eca65313875221842c53de6907d6c', 'vin.txid': 'c04c413576307737f3ad48efe5d509ebc883e1d04822b3a2eccf6a80a4482932'}

тогда он отлично работает. Я думаю, проблема заключается в том, что мой запрос ищет 2 элемента в vin, но мне нужно искать оба. Что я делаю не так?

ответ

2

Чтобы получить $ в своем обновлении, чтобы определить элемент, который соответствует обоим свойствам в запросе, вы должны использовать $elemMatch в вашем объекте запроса:

{ txid: '7e621eeb02874ab039a8566fd36f4591e65eca65313875221842c53de6907d6c', 
    vin: {$elemMatch: { 
     txid: 'c04c413576307737f3ad48efe5d509ebc883e1d04822b3a2eccf6a80a4482932', 
     vout: 0 
    }}} 
Смежные вопросы