배열 내의 MongoDB 데이터베이스 이름 변경 필드
이름을 변경해야 합니다.indentifier
다음 중 하나:
{ "general" :
{ "files" :
{ "file" :
[
{ "version" :
{ "software_program" : "MonkeyPlus",
"indentifier" : "6.0.0"
}
}
]
}
}
}
해봤어요
db.nrel.component.update(
{},
{ $rename: {
"general.files.file.$.version.indentifier" : "general.files.file.$.version.identifier"
} },
false, true
)
단, 다음과 같이 반환됩니다.$rename source may not be dynamic array
.
중요한 점은, 해야 하는 일이 끔찍하게 들리지만, 해결책은 실제로 매우 쉽습니다.물론 이는 보유한 레코드의 수에 따라 달라집니다.여기 예가 있습니다.
db.Setting.find({ 'Value.Tiers.0.AssetsUnderManagement': { $exists: 1 } }).snapshot().forEach(function(item)
{
for(i = 0; i != item.Value.Tiers.length; ++i)
{
item.Value.Tiers[i].Aum = item.Value.Tiers[i].AssetsUnderManagement;
delete item.Value.Tiers[i].AssetsUnderManagement;
}
db.Setting.update({_id: item._id}, item);
});
어레이가 발견된 부분과 잘못된 이름이 발견된 부분을 컬렉션에서 반복합니다.그런 다음 하위 컬렉션에서 반복하고 새 값을 설정하고 이전 문서를 삭제한 후 전체 문서를 업데이트합니다.비교적 통증이 없었다.내가 검색할 행이 수만 개밖에 없는데, 그 중 기준을 충족하는 행은 수십 개에 불과합니다.
그래도 나는 이 대답이 누군가에게 도움이 되었으면 좋겠어!
편집: 추가됨snapshot()
에 액세스 합니다.이유를 댓글로 보세요.
신청하셔야 합니다.
snapshot()
데이터베이스에서 문서를 검색하기 전에 커서로 이동합니다.사용할 수 있는 것은snapshot()
흠잡을 데 없는 수집품들로요
MongoDB 3.4부터snapshot()
기능이 삭제되었습니다.따라서 Mongo 3.4+를 사용하는 경우 위의 예에서 삭제해야 합니다.snapshot()
기능.
매뉴얼에서 설명한 바와 같이 단일 명령어로 어레이 내의 필드 이름을 직접 변경할 수 있는 방법은 없습니다.유일한 옵션은 컬렉션 문서를 반복하고, 읽고, 다음을 사용하여 각 문서를 업데이트하는 것입니다.$unset
구식/$set
새로운 운영
저도 비슷한 문제가 있었어요.제 상황에서는 다음 사항이 훨씬 더 쉬웠습니다.
- 컬렉션을 json으로 내보냈습니다.
mongoexport --db mydb --collection modules --out modules.json
제가 좋아하는 텍스트 편집 유틸리티를 사용하여 json에서 검색 및 교환을 했습니다.
편집한 파일을 다시 Import하여 이전 컬렉션을 삭제했습니다.
mongoimport --db mydb --collection modules --drop --file modules.json
시작하는Mongo 4.2
는 집약 파이프라인을 받아들일 수 있으며, 최종적으로 자체 값에 따라 필드를 갱신할 수 있습니다.
// { general: { files: { file: [
// { version: { software_program: "MonkeyPlus", indentifier: "6.0.0" } }
// ] } } }
db.collection.updateMany(
{},
[{ $set: { "general.files.file": {
$map: {
input: "$general.files.file",
as: "file",
in: {
version: {
software_program: "$$file.version.software_program",
identifier: "$$file.version.indentifier" // fixing the typo here
}
}
}
}}}]
)
// { general: { files: { file: [
// { version: { software_program: "MonkeyPlus", identifier: "6.0.0" } }
// ] } } }
말 그대로 이거update
(re)에 의한 s 문서$set
에 색을 입히다"general.files.file"
로 정렬하다.$map
ping을 실행하다"file"
요소들in
a "version"
같은 것을 포함하는 물체"software_program"
필드 및 이름 변경"identifier"
과거에 가치가 있던 것을 포함하는 필드"indentifier"
.
몇 가지 추가 세부 정보:
첫 번째 부분
{}
는 갱신할 문서(이 경우 모든 문서)를 필터링하는 일치 쿼리입니다.두 번째 부분
[{ $set: { "general.files.file": { ... }}}]
는 업데이트 집약 파이프라인입니다(집약 파이프라인 사용을 나타내는 각 괄호 참조).$set
새로운 집약 연산자이며, 이 경우 에서는 의 값을 치환합니다."general.files.file"
manager.manager로 하다- 조작을 사용하여, 의 모든 요소를 교환합니다.
"general.files.file"
은 기본적으로 요소로 되지만, "배열"은 "배열"로 지정됩니다."identifier"
보다 밭"indentifier"
: input
매핑할 배열입니다.as
입니다.in
는 요소에 적용되는 실제 변환입니다.를 "", ""로 ."version"
object a a a a a로"software_program"
a. a. a."identifier"
[ ]이렇게 하다는 이전 됩니다.$$file.xxxx
여기서 「」(「」)file
에서의 요소에 붙여진 이름입니다.as
을 사용하다
나는 같은 스키마로 그 문제에 직면해야 했다.따라서 이 쿼리는 임베디드 배열의 필드 이름을 바꾸려는 사용자에게 유용합니다.
db.getCollection("sampledocument").updateMany({}, [
{
$set: {
"general.files.file": {
$map: {
input: "$general.files.file",
in: {
version: {
$mergeObjects: [
"$$this.version",
{ identifer: "$$this.version.indentifier" },
],
},
},
},
},
},
},
{ $unset: "general.files.file.version.indentifier" },
]);
또한 배열에서 속성 이름을 바꾸고 싶습니다. 그리고 thaht를 사용했습니다.
db.getCollection('YourCollectionName').find({}).snapshot().forEach(function(a){
a.Array1.forEach(function(b){
b.Array2.forEach(function(c){
c.NewPropertyName = c.OldPropertyName;
delete c["OldPropertyName"];
});
});
db.getCollection('YourCollectionName').save(a)
});
Aggregate(Mongo 4.0+)를 사용하는 가장 쉽고 짧은 솔루션.
db.myCollection.aggregate([
{
$addFields: {
"myArray.newField": {$arrayElemAt: ["$myArray.oldField", 0] }
}
},
{$project: { "myArray.oldField": false}},
{$out: {db: "myDb", coll: "myCollection"}}
])
위에서 설명한 바와 같이 for를 사용하는 경우의 문제는 수집이 클 때 성능이 매우 떨어진다는 것입니다.
제 제안은 다음과 같습니다.
db.nrel.component.aggregate([
{ $unwind: "$general.files.file" },
{
$set: {
"general.files.file.version.identifier": {
$ifNull: ["$general.files.file.version.indentifier", "$general.files.file.version.identifier"]
}
}
},
{ $unset: "general.files.file.version.indentifier" },
{ $set: { "general.files.file": ["$general.files.file"] } },
{ $out: "nrel.component" } // carefully - it replaces entire collection.
])
이 은 어레이가 "", " " "일 경우에만 합니다.general.files.file
이치노이러한 경우가 항상 있는 것은 아닙니다만, 다음의 것을 사용할 수 있습니다.
db.nrel.componen.aggregate([
{ $unwind: "$general.files.file" },
{
$set: {
"general.files.file.version.identifier": {
$ifNull: ["$general.files.file.version.indentifier", "$general.files.file.version.identifier"]
}
}
},
{ $unset: "general.files.file.version.indentifier" },
{ $group: { _id: "$_id", general_new: { $addToSet: "$general.files.file" } } },
{ $set: { "general.files.file": "$general_new" } },
{ $unset: "general_new" },
{ $out: "nrel.component" } // carefully - it replaces entire collection.
])
언급URL : https://stackoverflow.com/questions/9122966/mongodb-rename-database-field-within-array
'programing' 카테고리의 다른 글
React-redux는 업데이트를 저장하지만 React는 저장되지 않음 (0) | 2023.03.16 |
---|---|
WordPress: post_parent 제목 가져오기 (0) | 2023.03.16 |
css를 사용한 img 태그 위의 그라데이션 (0) | 2023.03.16 |
github Dependabot 경보:n번째 체크의 비효율적인 정규 표현 복잡성 (0) | 2023.03.16 |
MongoDB 3.0의 '소켓 파일 링크 해제 실패' 오류 (0) | 2023.03.16 |