mongodb의 배열에 있는 모든 요소에서 필드 제거
MongoDB(2.4.5)에 아래 문서가 있습니다.
{
"_id" : 235399,
"casts" : {
"crew" : [
{
"_id" : 1186343,
"withBase" : true,
"department" : "Directing",
"job" : "Director",
"name" : "Connie Rasinski"
},
{
"_id" : 86342,
"withBase" : true
}
]
},
"likes" : 0,
"rating" : 0,
"rating_count" : 0,
"release_date" : "1955-11-11"
}
casts.crew 내부의 배열 요소에서 Base file로 제거하고 싶습니다.
해봤습니다.
db.coll.update({_id:235399},{$unset: { "casts.crew.withBase" : 1 } },false,true)
변한 것이 없습니다.
그리고 이것을 시도했습니다.
db.coll.update({_id:235399},{$unset: { "casts.crew" : { $elemMatch: { "withBase": 1 } } } },false,true)
문서에서 전체 승무원 배열을 제거했습니다.
누군가 저에게 올바른 질문을 해주실 수 있나요?
새로운 기능을 사용하여 3.6에서 어레이의 여러 요소를 업데이트할 수 있습니다.
비슷한 것
db.coll.update( {_id:235399}, {$unset: {"casts.crew.$[].withBase":""}} )
$[] 모든 항목 제거withBase
로부터의 재산.crews
배열. 배열의 모든 요소를 업데이트하는 자리 표시자 역할을 합니다.
다중 참을 사용하여 여러 문서에 영향을 미칩니다.
실망시켜서 미안하지만, 당신의 대답은.
db.coll.update({
_id:235399,
"casts.crew.withBase": {$exists: true}
},{
$unset: {
"casts.crew.$.withBase" : true
}
},false,true)
정확하지 않습니다.실제로는 값을 제거하지만 위치 연산자의 작동 방식 때문에 하위 문서가 처음 나타나는 경우에만 값이 제거됩니다.
위치 $ 연산자가 쿼리 문서와 일치하는 첫 번째 요소에 대한 자리 표시자 역할을 합니다.
또한 사용할 수 없습니다.$unset
배열에서 작동할 수 없기 때문에 (이전에 시도한 대로) 배열에서 문서에서 키를 제거하려고 하는 것입니다.또한 다음으로 제거할 수 없습니다.$pull
풀은 단순히 필드가 아닌 모든 배열을 제거하기 때문입니다.
그러므로 제가 아는 한 당신은 간단한 조작자로는 이것을 할 수 없습니다.그래서 마지막 수단은 하는 것입니다.$find
그리고 나서.forEach
을 제외하고여기 제 대답에서 이것을 어떻게 하는지 알 수 있습니다.당신의 경우, 당신은 다른 루프를 가지고 있어야 합니다.forEach
배열을 통해 반복하고 키를 삭제하는 기능.저는 당신이 그것을 수정할 수 있기를 바랍니다.안된다면 제가 도와드리겠습니다.
추신: 만약 누군가가 이것을 할 방법을 찾는다면 - 여기 산드라의 기능이 있습니다.
db.coll.find({_id:235399}).forEach( function(doc) {
var arr = doc.casts.crew;
var length = arr.length;
for (var i = 0; i < length; i++) {
delete arr[i]["withBase"];
}
db.coll.save(doc);
});
저는 객체를 끌어올리지 않고 이 목록을 해제하는 방법을 찾았습니다(즉, 업데이트만 하는 것). 꽤나 해킹적이지만 거대한 데이터베이스를 가지고 있다면 거래를 할 수 있을 것입니다.
db.coll.update({},{$unset: {"casts.crew.0.withBase" : 1, "casts.crew.1.withBase" : 1} }, {multi: 1})
다시 말해, 문서 목록에 얼마나 많은 개체가 있을 수 있는지 계산하고 이 경우 다음과 같이 명시적으로 숫자를 추가해야 합니다.{casts.crew.NUMBER.withBase: 1}
.
또한 mongodb 개체에서 가장 긴 배열을 계산하기 위해 다음과 같은 집계를 수행할 수 있습니다.
db.coll.aggregate( [ { $unwind : "$casts.crew" }, { $group : { _id : "$_id", len : { $sum : 1 } } }, { $sort : { len : -1 } }, { $limit : 1 } ], {allowDiskUse: true} )
이것이 좋은 해결책은 아니지만 가져오는 것과 절약하는 것보다 훨씬 빠르다는 것을 강조하고 싶습니다.
언급URL : https://stackoverflow.com/questions/19945924/remove-a-field-from-all-elements-in-array-in-mongodb
'source' 카테고리의 다른 글
원하지 않는 이상한 Xcode 로그 숨기기 (0) | 2023.04.29 |
---|---|
'시스템'넷. http.HttpContent'에 'ReadAsync'에 대한 정의가 없고 확장 메서드가 없습니다. (0) | 2023.04.29 |
셀(1,1)을 "A1"로 변환하거나 그 반대로 변환합니다. (0) | 2023.04.29 |
HTTP 핸들러 대 HTTP 모듈 (0) | 2023.04.29 |
-Wait 대신 Start-Process 및 WaitForExit을 사용하여 종료 코드 가져오기 (0) | 2023.04.29 |