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
'programing' 카테고리의 다른 글
그래들 잡으러요Spring Boot에 빌드 버전 (0) | 2023.02.26 |
---|---|
JSON에 대한 PDOStainment (0) | 2023.02.26 |
하위 React 구성 요소에서 상위 메서드를 호출하려면 어떻게 해야 합니까? (0) | 2023.02.26 |
React state vs Redux Store를 선택하는 경우 (0) | 2023.02.26 |
gradle process 명령어 java가 0이 아닌 exit 값 1로 종료되었습니다. (0) | 2023.02.26 |