2014-02-05 4 views
3

누구나 30 초보다 오래된 문서에 대한 컬렉션에 대한 쿼리에 대한 좋은 접근 방법을 가지고 있습니다. 30 초 이상 특정 상태에있는 항목을 실패로 표시하는 정리 작업자를 만듭니다.30 초보다 오래된 문서에 대한 MongoDB 쿼리

중요한 것은 아니지만이 경우에는 mongojs을 사용하고 있습니다.

모든 문서에는 created 시간이 있습니다.

답변

6

을 우리는 당신이 그것을 삽입하거나 그렇지 않으면 당신에게 중요한에 따라 수정 된 시간이 문서에 created_at 또는 유사한 필드가 가정합니다.

multi 옵션을 update에 입력하여 쿼리와 일치하는 모든 문서에 변경 내용을 적용 할 수 있습니다. 당신이 꽤 많이 드라이버의 동일해야하는 쉘 구문에서

매우 간단합니다 과거를보고 원하는 시간을 설정 : 첫 번째 false 어떤 이해가되지 않습니다 upserts하기위한 것이며

db.collection.update({ 
    created_at: {$lt: time }, 
    state: oldstate 
}, 
{$set: { state: newstate } }, false, true) 

이 용도에서는 multi 문서 업데이트 용으로 표시됩니다.

문서가 실제로 수명이 짧고 이후에 다른 문서가 필요하지 않은 경우 capped collections을 고려해 볼 수 있습니다. 이러한 경우에 total size 또는 time to live 옵션을 사용할 수 있으며 자연어 삽입 순서는 대기중인 항목 처리를 선호합니다.

3

당신은 그런 일 사용할 수 있습니다

var d = new Date(); 
d.setSeconds(d.getSeconds() - 30); 

db.mycollection.find({ created_at: { $lt: d } }).forEach(function(err, doc) {}); 
+0

내가 함께 사용할 수있는 권리 형식으로 날짜 개체를 얻을하는 방법을 잘했다 쿼리. 이것은 훌륭하게 작동했습니다. 감사! –

7

이 사용 몽고 쉘 수행 할 경우

db.requests.find({created: {$lt: new Date((new Date())-1000*60*60*72)}}).count() 

... 나이가 72 시간 인 문서를 찾을 수를 ("지금"마이너스 "72 * 60 * 60 * 1000"밀리 초) . 30 초는 1000 * 30이됩니다.

2

TTL 옵션은 또한 우아한 솔루션입니다. 그것은 x 초 후 자동으로 문서를 삭제 인덱스의 여기를 참조 : https://docs.mongodb.org/manual/core/index-ttl/

예제 코드는 다음과 같습니다

db.yourCollection.createIndex({ created:1 }, { expireAfterSeconds: 30 })