복붙노트

[MONGODB] MongoDB의에서 정확한 요소 배열에서 업데이트 필드

MONGODB

MongoDB의에서 정확한 요소 배열에서 업데이트 필드

나는이 같은 구조 문서를 가지고 :

{
    _id:"43434",
    heroes : [
        { nickname : "test",  items : ["", "", ""] },
        { nickname : "test2", items : ["", "", ""] },
    ]
}

나는 별명 "테스트"와 배열 영웅에 포함 된 개체의 항목 배열의 두 번째 요소를 설정 $ 수 있습니까?

결과:

{
    _id:"43434",
    heroes : [
        { nickname : "test",  items : ["", "new_value", ""] }, // modified here
        { nickname : "test2", items : ["", "", ""] },
    ]
}

해결법

  1. ==============================

    1.MongoDB를의 위치 연산자와 간단하게 업데이트 할 항목의 숫자 인덱스를 사용 : 당신은이 개념을 활용해야합니다.

    MongoDB를의 위치 연산자와 간단하게 업데이트 할 항목의 숫자 인덱스를 사용 : 당신은이 개념을 활용해야합니다.

    위치 연산자를 사용하면 다음과 같은 조건을 사용할 수 있습니다 :

    {"heros.nickname": "test"}
    

    다음과 같이 발견 배열 항목 참조 :

    {"heros.$  // <- the dollar represents the first matching array key index
    

    당신이 "항목"의 2 차 배열 항목을 업데이트 할, 그리고 배열의 키는 인덱스 0 인 것처럼 - 그 키 1입니다.

    그래서:

    > db.denis.insert({_id:"43434", heros : [{ nickname : "test",  items : ["", "", ""] }, { nickname : "test2", items : ["", "", ""] }]});
    > db.denis.update(
        {"heros.nickname": "test"}, 
        {$set: {
            "heros.$.items.1": "new_value"
        }}
    )
    > db.denis.find()
    {
        "_id" : "43434", 
        "heros" : [
            {"nickname" : "test", "items" : ["", "new_value", "" ]},
            {"nickname" : "test2", "items" : ["", "", "" ]}
        ]
    }
    
  2. ==============================

    2.

    db.collection.update(
    {
    heroes:{$elemMatch:{ "nickname" : "test"}}},
     {
         $push: {
            'heroes.$.items': {
               $each: ["new_value" ],
               $position: 1
            }
         }
       }
    
    )
    
  3. ==============================

    3.이 솔루션은 잘 작동합니다. 그냥 한 지점을 추가 할 수 있습니다. 여기서 구조이다. 나는 OrderItemId가 'YYY'및 업데이트를 찾을 필요가있다. 조건에서 쿼리 필드가 아래와 같이 배열 인 경우 "OrderItems.OrderItemId는"배열입니다. 당신은 쿼리에서 작업으로 "OrderItems.OrderItemId [0]"사용할 수 없습니다. 대신 비교 "OrderItems.OrderItemId"를 사용해야합니다. 그렇지 않으면 하나와 일치 할 수 없다.

    이 솔루션은 잘 작동합니다. 그냥 한 지점을 추가 할 수 있습니다. 여기서 구조이다. 나는 OrderItemId가 'YYY'및 업데이트를 찾을 필요가있다. 조건에서 쿼리 필드가 아래와 같이 배열 인 경우 "OrderItems.OrderItemId는"배열입니다. 당신은 쿼리에서 작업으로 "OrderItems.OrderItemId [0]"사용할 수 없습니다. 대신 비교 "OrderItems.OrderItemId"를 사용해야합니다. 그렇지 않으면 하나와 일치 할 수 없다.

    {
      _id: 'orderid',
      OrderItems: [
       {
         OrderItemId: ['xxxx'], 
        ... },
       {
         OrderItemId: ['yyyy'], 
        ...}, 
    ]
    
    }
    
     result =  await collection.updateOne(
            { _id: orderId, "OrderItems.OrderItemId": [orderItemId] },
            { $set: { "OrderItems.$.imgUrl": imgUrl[0], "OrderItems.$.category": category } },
            { upsert: false },
          )
        console.log('  (result.modifiedCount) ', result.modifiedCount)
        console.log('  (result.matchedCount) ', result.matchedCount)
    
  4. from https://stackoverflow.com/questions/10432677/update-field-in-exact-element-array-in-mongodb by cc-by-sa and MIT license