MongoDB: 어레이 내의 인덱스에 의해 참조되는 어레이 내의 단일 서브 요소를 업데이트하려면 어떻게 해야 합니까?
mongodb 문서의 배열에 포함된 단일 하위 요소를 업데이트하려고 합니다.어레이 인덱스를 사용하여 필드를 참조합니다(어레이 내의 요소에는 고유 식별자가 될 수 있는 필드가 없습니다).이게 쉬울 것 같은데 구문을 알 수가 없네요.
이게 내가 의사짜리로 하고 싶은 일이야.
이전:
{
_id : ...,
other_stuff ... ,
my_array : [
{ ... old content A ... },
{ ... old content B ... },
{ ... old content C ... }
]
}
그 후:
{
_id : ...,
other_stuff ... ,
my_array : [
{ ... old content A ... },
{ ... NEW content B ... },
{ ... old content C ... }
]
}
쿼리는 다음과 같이 해야 할 것 같습니다.
//pseudocode
db.my_collection.update(
{_id: ObjectId(document_id), my_array.1 : 1 },
{my_array.$.content: NEW content B }
)
하지만 이건 안 돼mongodb 문서를 검색하여 이 구문에서 다른 변형을 시도했습니다(예: 사용).$slice
등).MongoDB에서 이러한 업데이트를 수행하는 방법에 대한 명확한 설명을 찾을 수 없습니다.
예상대로 방법을 알면 쿼리가 쉬워집니다.다음은 python 구문입니다.
db["my_collection"].update(
{ "_id": ObjectId(document_id) },
{ "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}}
)
Mongo Shell의 인덱스(예: 1)에서 참조되는 어레이 요소의 업데이트는 인덱스 값을 직접 표시하여 수행할 수도 있습니다.
db.my_collection.update(
{_id : "document_id"},
{$set : {"my_array.1.content" : "New content B"}}
)
mongo 스타일에서는 '$' 위치 연산자를 사용합니다.자세한 내용은 이 링크를 참조하십시오.
db.my_collection.update(
{_id: ObjectId(document_id), my_array.1 : 1 },
{ $set: { "my_array.$.content" : "NEW content B" } }
)
실제 인덱스는 몰라도 요소의 고유 식별자가 있는 어레이 요소를 업데이트해야 하는 경우:
// Modify a comment in a bucket
db.POST_COMMENT.update(
{
"_id": ObjectId("5ec424a1ed1af85a50855964"),
"bucket.commentId": "5eaf258bb80a1f03cd97a3ad_lepf4f"
},
{
$set: {
"bucket.$.text": "Comment text changed",
"bucket.$.createdDate": ISODate("2015-12-11T14:12:00.000+0000")
}
}
)
여기서"bucket.commentId"
는 어레이 요소의 고유 식별자입니다.
Javascript에서 Backticks를 사용하면 다음과 같은 작업을 수행할 수 있습니다.
const index = 1;
... { $set: { [`myArray.${index}.value`]: "new content"} }, ...
db.my_collection.update(
{_id: ObjectId(document_id), my_array : { ... old content A ... } },
{ $set: { "my_array.$.content" : "NEW content B" } }
)
실제 인덱스인지 몰라도 요소의 고유 식별자가 있는 어레이 요소를 업데이트해야 하는 경우
db.getCollection('profiles').update(
{
'userId':'4360a380-1540-45d9-b902-200f2d346263',
'skills.name':'css'
},
{
$set: {'skills.$.proficiencyLevel': 5}
},
{
multi: true
}
)
다음 문서에서 _id = 60c4918d74c30165ba585c14인 추천의 authorName을 갱신하는 경우:
"business": {
"ownerId": "60a5ebad7432d91b853c0277",
"testimonials": [
{
"_id": "60c4912877dd5664f2201b08",
"authorName": "user1",
"authorBio": "User from 10 years",
"image": "user1/img1",
"review": "asdfiuahsdfpoiuashdpfoaspdlfkjn;alsfpuoh"
},
{
"_id": "60c4918d74c30165ba585c14",
"authorName": "user2",
"authorBio": "User from 3 years",
"image": "user/img1",
"review": "asdpfuahsfljnsadfoihsf."
}
],
"createdAt": "2021-06-11T20:12:56.666Z",
"updatedAt": "2021-06-12T11:11:56.696Z",
}
그러면 다음 mongoose 쿼리가 작동합니다.
await BusinessModel.updateOne(
{
'_id': Mongoose.Types.ObjectId(businessId),
'testimonials._id': Mongoose.Types.ObjectId('60c4918d74c30165ba585c14')
},
{
$set: { 'testimonials.$.authorName' : 'new author name' }
}
);
https://docs.mongodb.com/drivers/node/fundamentals/crud/write-operations/embedded-arrays/ 도 참조해 주세요.
오래된 콘텐츠 B의 키가 예당 "값"인 경우 배열 내 요소의 인덱스를 전달하는 mongoDB의 updateOne 함수를 사용할 수 있습니다.
[
...
"value" : "old content A"
"value" : "old content B"
"value" : "old content C"
...
]
명령어는 다음과 같습니다.
db.collection.updateOne({"_id" : "...,"},{$set: {"my_array.1.value": "NEW content B"}})
단순한 문자열을 포함하는 "일반" 배열이 있는 경우 다음과 같이 처리됩니다.
db.paintings.insertMany([
{_id: 1, colors: ["red", "blue", "green"]},
{_id: 2, colors: ["red", "yellow"]}
db.paintings.updateMany(
{colors: "red"},
{$set: {"colors.$": "magenta"}})
위치 $ 연산자는 쿼리 문서와 일치하는 첫 번째 요소의 자리 표시자 역할을 합니다. 소스
언급URL : https://stackoverflow.com/questions/11372065/mongodb-how-do-i-update-a-single-subelement-in-an-array-referenced-by-the-inde
'source' 카테고리의 다른 글
열 크기를 수정하는 방법 (0) | 2023.03.01 |
---|---|
Wordpress 하위 카테고리에 카테고리 템플릿 사용 (0) | 2023.03.01 |
JavaScript 최대 Blob 크기에 제한이 있습니까? (0) | 2023.02.22 |
JSX react/react-in-jsx-scope를 사용할 때 'React'가 범위에 있어야 합니까? (0) | 2023.02.22 |
Basic Respect 폼 제출 시 페이지 전체가 갱신됩니다. (0) | 2023.02.22 |