2013-11-26 2 views
0

컬렉션 다음 tags 배열의Mongodb에서 기본 유형의 배열을 업데이트하는 방법은 무엇입니까?

post: 
    title: 'Help' 
    tags: ['mongodb','foo'] 

요소는 고유합니다. 모든 foo 태그를 bar 태그로 변경하고 싶습니다. $set 배열의 요소를 한 번에 배열 할 수 있습니까? 아니면 모든 태그 배열에서 foo을 제거하고 bar을 추가해야합니까? 당신의 tags 배열이 하나 이상의 foo 값이 포함 된 경우

db.posts.update({ tags: "foo" }, { $set: { "tags.$": "bar" } }, { multi: true}); 

그러나

는,이 쿼리 그 중 하나을 대체합니다 :

답변

1

이 쿼리를 사용해보십시오.

+0

그래서 OP가 필요하다면 요소 수를 N이라면 N + 1 명령을 서버에 대해 실행해야합니다. N –

+0

예, 하나의'tags' 배열에 N 개의'foo' 값이 있으면 true입니다. 하지만 내가 이해하는 한, OP는 특정 배열이 아닌 모든 게시물 모음을 업데이트하려고합니다. – Shad

1

한 번 쿼리하면이 작업을 수행 할 수 없습니다. 이를 달성하는 한 합리적인 방법은 $ 풀을 사용하고 $ 같이 밀어했을 것이다 :

db.a.update({ 
    tags : 'foo' 
    },{ 
    $pull : {tags : 'foo'}, 
    $push : {tags : 'bar'} 
    },{ 
    multi : true 
}) 

을하지만 이것은 기본적으로 당신이 있음을 알려줍니다 수정 오류 메시지와 함께 사용할 수 없습니다 필드 이름 중복으로 끝낼 것 동시에 $ pull과 $ push를 사용할 수 없습니다. Jira ticket was filed 몇 년 전이지만 아직 해결되지 않았습니다. (부 도의 라벨을 기반으로하면 곧 해결 될 가능성은 거의 없습니다.)

foo이있는 문서의 ID를 찾기 위해 쿼리를 실행 한 다음이 모든 것을 모두 제거하는 다른 쿼리 foo과 모든 ID에 bars을 삽입하는 쿼리를 실행하는 것이 하나의 방법입니다. 나는이 업데이트들 사이에서 잠재적으로 컬렉션을 수정할 수있는 것을 알고 있지만 이것은 하나의 옵션입니다.

또 다른 방법은 태그가 foo이고 modify them in foreach statement 인 모든 요소를 ​​반복하는 것입니다.

관련 문제