몽고로 풀링과 세트 추가를 동시에 합니다.
다음과 같이 단순화할 수 있는 요소를 수집했습니다.
{tags : [1, 5, 8]}
배열에 하나 이상의 요소가 있고 모든 요소가 달라야 합니다.저는 한 태그를 다른 태그로 대체하고 싶고 문제가 없을 것이라고 생각했습니다.그래서 저는 다음과 같은 질문을 생각해냈습니다.
db.colll.update({
tags : 1
},{
$pull: { tags: 1 },
$addToSet: { tags: 2 }
}, {
multi: true
})
좋습니다. 그래서 그것은 제가 필요로 하지 않는 태그가 있는 모든 요소를 찾을 것입니다. (1) 그것을 제거하고 만약 그것이 아직 없다면 다른 (2)를 추가할 것입니다.문제는 오류가 발생한다는 것입니다.
"'태그'와 '태그'를 동시에 업데이트할 수 없습니다."
즉, 풀과 세트에 추가를 동시에 할 수 없다는 것입니다.제가 이것을 할 수 있는 다른 방법이 있나요?
물론 저는 요소의 ID를 모두 외운 다음 태그를 제거하고 별도의 쿼리를 추가할 수 있지만, 이것은 좋게 들리지 않습니다.
이 오류는 동일한 업데이트 작업에서 동일한 "경로"의 두 가지 작업에 대해 작업할 수 없기 때문에 거의 의미합니다.사용 중인 두 연산자는 생각처럼 순차적으로 처리되지 않습니다.
그러나 "대량" 운영 API 또는 다른 형태의 "대량" 업데이트를 통해 가능한 한 "순차적"으로 이 작업을 수행할 수 있습니다.당연한 이치 내에서, 그리고 역으로:
var bulk = db.coll.initializeOrderedBulkOp();
bulk.find({ "tags": 1 }).updateOne({ "$addToSet": { "tags": 2 } });
bulk.find({ "tags": 1 }).updateOne({ "$pull": { "tags": 1 } });
bulk.execute();
다른 어떤 것도 수정하려고 시도하지 않는다는 보장은 없지만, 현재 얻을 수 있는 것만큼 가깝습니다.
여러 문서가 있는 원시 "업데이트" 명령도 참조하십시오.
제거 및 추가를 동시에 수행하는 경우 '세트' 대신 '맵'을 모델링하는 것일 수 있습니다.그렇다면 개체가 배열보다 작업량이 적을 수 있습니다.
데이터를 배열로 사용하는 대신:
{ _id: 'myobjectwithdata',
data: [{ id: 'data1', important: 'stuff'},
{ id: 'data2', important: 'more'}]
}
데이터를 개체로 사용:
{ _id: 'myobjectwithdata',
data: { data1: { important: 'stuff'},
data2: { important: 'more'} }
}
단일 명령 업데이트는 다음과 같습니다.
db.coll.update(
'myobjectwithdata',
{ $set: { 'data.data1': { important: 'treasure' } }
);
이 대답을 위해 열심히 일하는 것은 여기와 여기에서 이루어졌습니다.
시작 위치Mongo 4.4
집계 연산자는 사용자 정의 Javascript 함수를 적용하여 MongoDB 쿼리 언어에서 지원되지 않는 동작을 구현할 수 있습니다.
그리고 그것에 대한 개선과 함께.Mongo 4.2
집계 파이프라인을 수용하여 자체 값을 기반으로 필드를 업데이트할 수 있습니다.
언어가 쉽게 허용하지 않는 방식으로 배열을 조작하고 업데이트할 수 있습니다.
// { "tags" : [ 1, 5, 8 ] }
db.collection.updateMany(
{ tags: 1 },
[{ $set:
{ "tags":
{ $function: {
body: function(tags) { tags.push(2); return tags.filter(x => x != 1); },
args: ["$tags"],
lang: "js"
}}
}
}]
)
// { "tags" : [ 5, 8, 2 ] }
$function
세 가지 매개 변수를 사용합니다.
body
매개 변수가 수정할 배열인 적용할 함수입니다. 여서의함다같구이성다니됩음과수는기▁in로 구성되어 .push
잉2
및 배열및에filter
1
.args
여기에는 레코드의 필드가 포함되어 있습니다.body
함수는 매개 변수로 사용됩니다.저희 같은 경우에는."$tag"
.lang
그것이 그 언어입니다.body
함수가 작성되었습니다..js
현재 사용할 수 있습니다.
배열의 한 값을 다른 값으로 바꿔야 하는 경우 다음 답변을 확인합니다.
언급URL : https://stackoverflow.com/questions/24300148/pull-and-addtoset-at-the-same-time-with-mongo
'programing' 카테고리의 다른 글
VB 스크립트를 실행하는 동안 Excel의 모든 대화 상자를 사용하지 않도록 설정하시겠습니까? (0) | 2023.06.24 |
---|---|
여러 데이터 소스를 위해 봄에 액체 기반을 설정하는 방법은 무엇입니까? (0) | 2023.06.24 |
SQL Server: Oracle에서 동일한 RowVersion (0) | 2023.06.24 |
'객체 배열'을 키 값의 단순 배열에 매핑합니다. (0) | 2023.06.24 |
오라클의 like 절에 매개 변수 사용 (0) | 2023.06.24 |