programing

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

codeshow 2023. 2. 26. 10:19
반응형

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

다음과 같이 구성된 문서가 있습니다.

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

내가 할 수 있을까$set의 두 번째 요소items배열에 포함된 개체 배열heros와 함께nickname "test"?

결과:

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

mongodb의 위치 연산자와 단순히 업데이트하려는 엔트리에 숫자 인덱스를 사용하는 두 가지 개념을 사용해야 합니다.

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

{"heroes.nickname": "test"}

검색된 어레이 엔트리를 다음과 같이 참조합니다.

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

"items"의 두 번째 어레이 엔트리를 업데이트하고 어레이 키는 0으로 색인화되어 있습니다(키 1).

그래서:

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

위치 $사용하여 배열 문서를 업데이트해 보십시오.

$ 연산자 포지션을 사용하면 임베디드 문서를 포함하는 어레이를 쉽게 업데이트할 수 있습니다.$ 연산자의 점 표기로 포함된 문서의 필드에 액세스하려면 $ 연산자를 사용합니다.

db.collection.update(
  { "heroes.nickname": "test" },
  { $set: { "heroes.$.items.1": "new_value" } },
  { multi: true }
);

놀이터.

이 솔루션은 잘 작동합니다.1점만 더 보태고 싶다.이게 구조입니다.OrderItemId가 yyy인 것을 찾아 업데이트해야 합니다.조건의 쿼리 필드가 "OrderItems" 아래의 배열인 경우.OrderItemId"는 어레이입니다.Order Items는 사용할 수 없습니다.오더 아이템ID[0]"를 쿼리의 조작으로 지정합니다.대신 "Order Items"를 사용해야 합니다.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)

포지션 $와 $ 포지션으로 업데이트를 시도합니다.

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

더 멀리!문자열 템플릿을 사용하여 변수 인덱스 붙여넣기 방법

   yourModel.findOneAndUpdate(
     { _id: "43434" },
     {
       $set: {
         [`heroes.${heroesIndex}.items.${itemIndex}`]: "new_value",
       },
     }
   );

또는 템플릿 없음

   yourModel.findOneAndUpdate(
     { _id: "43434" },
     {
       $set: {
         'heroes.0.items.1': "new_value",
       },
     }
   );

언급URL : https://stackoverflow.com/questions/10432677/update-field-in-exact-element-array-in-mongodb

반응형