sql >> データベース >  >> NoSQL >> MongoDB

同じドキュメントのさまざまな部分で作業している位置$?

    あなたのコメントを考えると、あなたは正しい方向に進んでいるようです。ご存知のとおり、位置$ 演算子は単なる「値」コンテナであり、インデックスがあります。 クエリで一致した最初の配列要素の。

    あなたは「できた」 絶対にだった場合はそれを使用してください 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"
                    }
                }
            }
    
        ]
    })
    

    これについては、一括更新 のマニュアルページで説明されています。 。




    1. MongoDBクエリ結果の順序(数値範囲クエリ)

    2. MongoDBの1つのコマンドで増分2フィールドを更新するにはどうすればよいですか?

    3. MongoDB:起動時にソケットを設定できませんでした

    4. リクエストごとにMongoDBを複数回クエリしても大丈夫ですか?