2014-12-11 2 views
0

MongoDB 2.6.1을 사용하고 있습니다. 내게 묻는 질문은 다음과 같습니다. "벌크 작업에서 _id 트랙을 유지할 수 있습니까?" BulkWriteOperation에 대해 하나의 개체를 만든 경우 (예 : 50 개의 문서를 'A'컬렉션의 'B'컬렉션에 삽입하는 경우) 성공적인 쓰기 작업 및 쓰기 작업의 목록을 유지해야합니다..Mongodb 대량 작업의 추적 작업

벌크 삽입 및 삭제가 정상적으로 작동합니다. 그러나 질문은 - - "쿼리에 대해 _ids, 을 추적해야합니다.B 컬렉션에있는 문서를 찾으십시오. 반면에 나는 목록을 유지해야합니다. _ids (성공 및 실패한 작업) 성공적인 작업을 위해서만 A 컬렉션의 문서를 삭제해야하며 실패한 문서는 그대로 유지해야합니다. "-

도와주세요. 감사 하라구요

:)

답변

1

첫째, 당신은 실행 전체 배치에 대한 UnorderedBulkOperation를 사용해야합니다. BulkWriteOperation.execute() 주위에 시도/catch를 사용하여 BulkWriteException을 잡으면 BulkWriteErrorBulkWriteResult의 목록에 액세스 할 수 있습니다.

여기에 신속하고 더러운 예는 다음과 같습니다

MongoClient m = new MongoClient("localhost"); 
DB db = m.getDB("test"); 
DBCollection coll = db.getCollection("bulk"); 
coll.drop(); 
coll.createIndex(new BasicDBObject("i", 1), new BasicDBObject("unique", true)); 

BulkWriteOperation bulkWrite = coll.initializeUnorderedBulkOperation(); 

for (int i = 0; i < 100; i++) { 
    bulkWrite.insert(new BasicDBObject("i", i)); 
} 
// Now add 10 documents to the batch that will generate a unique index error 
for (int i = 0; i < 10; i++) { 
    bulkWrite.insert(new BasicDBObject("i", i)); 
} 

BulkWriteResult result = null; 
List<BulkWriteError> errors = null; 
try { 
    result = bulkWrite.execute(); 
} catch (BulkWriteException bwe) { 
    bwe.printStackTrace(); 
    errors = bwe.getWriteErrors(); 
    result = bwe.getWriteResult(); 
} 

for (BulkWriteError e : errors) { 
    System.out.println(e.getIndex() + " failed"); 
} 

System.out.println(result); 
+0

감사합니다 .. 그렇지는 모든 성공적인 운영하며 Object 및 운영 실패를 얻기 위해 수 있나요? – manojpt

+0

현재 내가 말할 수있는 최선의 방법은 아닙니다. 삽입 목록을 유지 관리하고 오류 색인을 사용하여 실패한 항목을 판별해야합니다. 성공적인 작업의 ID가 무엇인지 알 수 있도록 ObjectId를 명시 적으로 할당 할 수 있습니다. – helmy

+0

Ok, 정말 고맙습니다. Mongodb에서 SQL injection을 다루는 것에 대한 정보를 좀주세요. – manojpt