[MONGODB] MongoDB를 배열에있는 모든 요소의 필드 삭제 [중복]
MONGODBMongoDB를 배열에있는 모든 요소의 필드 삭제 [중복]
나는 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 내부 배열 요소에서 withBase 필드를 제거 할 ..
나는이 시도
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)
이는 문서의 전체 승무원 어레이를 제거 하였다.
누군가가 나에게 올바른 쿼리를 제공시겠습니까?
해결법
-
==============================
1.죄송하지만 답변을 실망
죄송하지만 답변을 실망
db.coll.update({ _id:235399, "casts.crew.withBase": {$exists: true} },{ $unset: { "casts.crew.$.withBase" : true } },false,true)
올바르지 않습니다. 방식 때문에 위치 연산자 작품, 실제로는 값을 제거하지만, 오직 하위의 제에서 발생 :
(이전에 시도로) (당신은 기본적으로 배열에서 문서에서 키를 제거하기 위해 노력하고있다)가 배열에 대한 작업을 할 수 없기 때문에 당신은 또한 $ 해제를 사용할 수 없습니다. 풀은 모든 배열, 그것의 단지 필드를 제거하기 때문에 또한, $ 풀로 제거 할 수 없습니다.
따라서 내가 아는 당신은 간단한 조작으로이 작업을 수행 할 수 없습니다. 최후의 수단은 $을하고 그래서 찾아 저장과 다음 대해 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); });
-
==============================
2.당신은 3.6 배열의 여러 요소를 업데이트 할 새 위치 식별자를 사용할 수 있습니다.
당신은 3.6 배열의 여러 요소를 업데이트 할 새 위치 식별자를 사용할 수 있습니다.
같은 뭔가
db.coll.update( {_id:235399}, {$unset: {"casts.crew.$[].withBase":""}} )
$ []를 승무원 어레이에서 모든 withBase 속성을 제거한다. 이는 어레이 내의 모든 요소를 갱신하는 자리로서 작용한다.
를 사용하여 다중 사실은 여러 문서에 영향을 미칠 수 있습니다.
-
==============================
3.나는 물체를 (단지 업데이 트를하고, 의미), 꽤 hackish입니다하지만 당신은 거대한 데이터베이스가있는 경우는 거래를하게됩니다 끌어하지 않고이 목록을 설정 해제하는 방법을 발견 :
나는 물체를 (단지 업데이 트를하고, 의미), 꽤 hackish입니다하지만 당신은 거대한 데이터베이스가있는 경우는 거래를하게됩니다 끌어하지 않고이 목록을 설정 해제하는 방법을 발견 :
db.coll.update({},{$unset: {"casts.crew.0.withBase" : 1, "casts.crew.1.withBase" : 1} }, {multi: 1})
즉,이 문서 목록의해야하며 {: 1 casts.crew.NUMBER.withBase}이 경우, 명시 적으로 그 숫자를 추가 할 수 있습니다 얼마나 많은 개체를 계산해야합니다.
또한, MongoDB의 오브젝트에서 가장 긴 배열을 계산, 집계,이 같은 일을 수행 할 수 있습니다 :
db.coll.aggregate( [ { $unwind : "$casts.crew" }, { $group : { _id : "$_id", len : { $sum : 1 } } }, { $sort : { len : -1 } }, { $limit : 1 } ], {allowDiskUse: true} )
그냥이 꽤 솔루션이 아니라 빠르게 가져 와서 저장하는 것보다 방법임을 강조하고 싶다.
from https://stackoverflow.com/questions/19945924/remove-a-field-from-all-elements-in-array-in-mongodb by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB의 통합 프레임 워크를 사용하여 소수점 이하 2 자리까지 반올림 (0) | 2019.12.05 |
---|---|
[MONGODB] 어떻게 MongoDB의 문서에서 이중으로 중첩 된 배열에서 요소를 제거합니다. (0) | 2019.12.05 |
[MONGODB] 몽고 복잡한 정렬? (0) | 2019.12.05 |
[MONGODB] 어떻게 총 수를 얻기 위해 MongoDB를에서 합계를 집계하는? (0) | 2019.12.05 |
[MONGODB] 와 MongoDB를 암호 "@"그 안에 (0) | 2019.12.05 |