あなたのコメントを考えると、あなたは正しい方向に進んでいるようです。ご存知のとおり、位置$ コード>
演算子は単なる「値」コンテナであり、インデックスがあります。 クエリで一致した最初の配列要素の。
あなたは「できた」 絶対にだった場合はそれを使用してください 2つのアレイが常にあることを確認してください 同じ数の要素が含まれており、これらの対応するエントリは常に同じ位置にありました。
そうです、安全のために、 $elemMatch を使用してください 2つ そのような更新操作
db.p.update( { '$and': [
{ '_searchData.addressesR': {$elemMatch: { 'street': 'BITTON' } } ] },
{ '$set': {
'_searchData.addressesR.$.street':'BITTON CHANGED' ,
}
})
db.p.update( { '$and': [
{ '_children.addressesR': {$elemMatch: { 'street': 'Bitton' } } ] },
{ '$set': {
'_children.addressesR.$.street': 'Bitton CHANGED'
}
})
ここでの唯一の実際の考慮事項は、2つの更新のために可能であるということです。 その読む ドキュメントのできた これらの更新と_searchData
の間に発生します および_children
ドキュメントには同じ対応するがありません addressesR
のエントリ アレイ。
両方の操作を再生する必要があるため、レプリケーションにも同じことが当てはまります。 セカンダリノードによって。
素晴らしい機能は、 updateで$elemMatchを使用できるようにすることです。 クエリの一部。このようにして、その側の要素の位置を照会することになります。しかし、これはまだ存在しません 。ただし、2.6以降ではできます 次のようなことをします:
db.runCommand({
"update": "p",
"updates": [
{
"q": { '_children.addressesR': {$elemMatch: { 'street': 'Bitton' } },
"u": {
"$set": {
"_children.addressesR.$.street": "Bitton CHANGED"
}
}
},
{
"q": { '_searchData.addressesR': {$elemMatch: { 'street': 'BITTON' } },
"u": {
"$set": {
"_searchData.addressesR.$.street": "BITTON CHANGED"
}
}
}
]
})
これについては、一括更新 のマニュアルページで説明されています。 。