2013-04-10 3 views
0

mongo 데이터베이스와 여러 컬렉션이 있습니다. 나는 target_id와 일치하는 모든 엔트리를 콜렉션에서 제거하고 싶다. 트릭은 target_id와 일치하는 항목에 "연결된"항목을 제거해야한다는 것입니다. 이제 MongoDB의 쿼리 결과에 대한 쿼리

DB 
Culture (_id, owner_id) 
Document (_id, target_id) 
Entity (_id, target_id) 
Field  (_id, entity_id) 
Form  (_id, target_id) 
Question (_id, form_id) 
Layout (_id, question_id) 

예를

를 들어

, 내가 easilily 그래서

db.Document.remove({"_id": ObjectId(target_id)}); 

최초의 까다로운 부분에서 모든 문서를 제거 할 수 있습니다, 문화 컬렉션에서 일부 항목이 owner_id = document_ID 아를 가질 수 있다는 것입니다. 그래서 엔터티 항목을 제거하기 전에 문화 항목을 제거해야합니다.

두 번째 문제는 해당 필드가 entity_id에서 찾을 수 있기 때문에 필드 컬렉션의 target_id 항목으로 직접 액세스 할 수 없다는 것입니다.

target_id를 제공하는 mongo 쉘에서 실행 한 다음 target_id에 의해 "직접 참조되거나"간접적으로 모든 항목을 제거하는 스크립트/쿼리를 작성하고 싶습니다. id에 의해 단순한 find/delete 경험이 없었기 때문에이 쿼리는 막혔다.

는 지금까지 내가 단계로이 단계를 수행 할 수 이해, 말하자면, 먼저 엔티티를 찾을 수 :

db.Entity.find({ "$where" : "{"target_id" : ObjectId(target_id)}" }); 

두 번째 단계는 쿼리에서 각 개체의 = 개체 ID를 OWNER_ID 모든 문화를 제거하는 것입니다 위. 어떻게하면 되나요?

db.Culture.find({ "$where" : "{"owner_id" : ObjectId(entity_id)}" }); 

여기서 entity_id는 첫 번째 쿼리를 모두 반복합니다.

+0

데이터가 관계형 인 것처럼 보입니다 ... mongo는 이러한 종류의 물건 대신 좋은 대안이 아닙니다. – tanaydin

답변

1

IIUC, 당신은 $in 연산자를 찾고 있습니다.

  1. SET1 = 당신이 ID가 설정 2와 운영자에
  2. 모든 문서 일치를 제거하는 것이 일치하는 모든 문서를 제거 SET1
  3. 에서 ID의 모든 참조 ID를 찾기 =
  4. SET2을 삭제하려는 모든 ID를 찾습니다 SET1

와의 연산자 ID는 ... 반복 계층 구조 아래로이 작업을 수행하는 것이

예 : 당신은 아마 ObjectId가

HTH findAndMondify를 사용하여 수행하는 방식의

+0

IIUC는 무엇입니까?그것은 어떤 종류의 속어입니까 – Sammaye

+0

만약 내가 정확히 이해한다면 : –

+0

아 ok kool thanks :) – Sammaye

0

하나와 접두사 필요가 없습니다

db.Culture.find({"owner_id" : {"$in":[set_of_entityids]" }}); 

참고는 쿼리에서 ID를 bson 얻을. ID를 다시 얻는 동시에 문서를 업데이트 할 수 있습니다. 따라서 문서를 ACTIVE = FALSE로 표시 한 다음 findAndModify에서 ID를 다시 가져옵니다. 마지막으로 ACTIVE = FALSE 인 모든 항목을 제거하십시오. 내 응용 프로그램에서 내가 어떻게 사용했는지 알 수 있습니다 : http://devesh4blog.wordpress.com/2013/03/01/findandmodify-in-mongodb-a-practical-example/