2017-12-01 1 views
0

나는 약 10 개의 Mio 문서가있는 내 mongodb에 콜렉션을 가지고있다. 나는 그들 모두를 가로 질러 어떤 분야를 바꾸고 싶다. 내 수정 상태를 변경하지 않기 때문에 동일한 문서를 다시 때마다 반환되기 때문에NodeJS - 몽구스로 대규모 콜렉션 분석

MyModel.find({/* condition... */}).limit(500).exec() 

을 다음과 같이 한 번에 촬영 너무 많은 데이터이기 때문에 프로그램을 충돌, 그리고 한계를 사용하는 것은 문제가있다.

누구든지 내게 점진적으로 전체 컬렉션을 트래버스하거나 수정할 수있는 힌트를 줄 수 있습니까?

+0

당신은 mongodb의'skip' 집계를 봐야한다고 생각합니다. –

답변

1

Kevin은 두 가지 유효한 옵션에 대해 설명했습니다.

또 다른 옵션은 기본적으로 페이지 매김 (paginate)하는 것입니다. _id으로 정렬하고 더 큰 숫자로 계속 쿼리하면 _id과 똑같은 논리를 유지할 수 있습니다. 뭔가 같이 : 당신이 500 개 레코드를받지 못한 후

var lastId = new ObjectId(); 
MyModel.find({/* condition... */, _id: {$gt: lastId}}).sort({_id: 
1}).limit(500).exec(function(err, records){ 
    // Your logic 
    lastId = records[records.length - 1]._id; 
}) 

당신은 비동기 while 루프의 어떤 종류의 기능을 포장하고 당신이 종료 할 필요가 것입니다.

1

Model.update 방법을 사용해 보셨습니까? http://mongoosejs.com/docs/2.7.x/docs/updating-documents.html을 참조하십시오. 작동 방식은 쿼리와 업데이트 문을 지정하고 쿼리와 일치하는 모든 문서를 검색 한 다음 각 문서에 업데이트를 적용하는 것입니다. 예 : 당신이 정말로 찾을-다음 업데이트를 사용해야하는 경우

const query = {}; 
const update = {$set: {name: "Bob"}}; 
const options = {}; 
Model.update(query, update, options, callback); 

, 당신은 아마 스트리밍보다는 완전히 한 번에 메모리에 실현 문서의 집합을 보장합니다 커서를 사용하려면 :

const cursor = Model.find(query).cursor() 
cursor.on('data', function(doc) {}); 
cursor.on('close', callback); 
관련 문제