2012-01-19 3 views
0

저는 mongodb로 작업하기 시작했습니다. 펄 스크립트는 트위터 스트림을 파싱하고 mongodb에 추가합니다. 이 부분은 잘 작동합니다.mongodb에서 새 레코드를 얻는 방법은 무엇입니까?

그러나 PHP에서 데이터베이스를 쿼리하지 못했습니다. 나는 ajax와 php를 조합하여 데이터베이스를 쿼리했으며 현재 마지막 30 개 항목을 얻는다. 지금은 몇 초 후에 최신 항목을 얻을 페이지를 갖고 싶습니다. mysql 데이터베이스를 사용하면 id를 매개 변수로 전달하고 데이터베이스에서 최신 정보를 얻지 만 mongodb에 어떻게 접근해야하는지 잘 모르겠습니다.

필자가 생각해 낸 두 가지 옵션은 컬렉션의 문서 수를 사용하여 그 문서를 건너 뛰는 최신 문서를 얻거나 펄 스크립트로 돌아가서 타임 스탬프를 트위터에서 쉬운 형식.

더 쉬운 방법이 있나요?

답변

1

MongoDB를 건너 뛰는 것은 관계형 데이터베이스에서와 같이 매우 비용이 많이 듭니다. 특히 데이터베이스 수집이 매우 큰 크기로 커질 때 (트위터 스트림 컬렉션 에서처럼). Mongo는 말 그대로 전체 컬렉션을 정렬하고 스캔 한 다음 건너 뛰려는 문서의 수를 반복하지만 반환하지 않기 때문입니다.

이 문제를 해결하는 더 좋은 방법은 쿼리를 사용하여 컬렉션의 올바른 위치로 "검색"한 다음 해당 지점에서 새로운 결과를 반환하는 것입니다. 트윗 문서에 타임 스탬프 필드 (BSON 날짜)가 있다고 가정합니다. 페이지를 렌더링 할 때 (또는 AJAX를 통해 업데이트 할 때), 지금까지 본 것의 최신 날짜를 기억해야합니다. 이것은 당신이 timestamp에 대한 인덱스 (또는 timestamp가 첫 번째 필드 인 복합 인덱스)가 가정 효율적입니다

db.tweets.find({timestamp: {$gt: last_seen_timestamp}}).sort({timestamp: 1}) 

: 그럼 당신은 같은 새로운 트윗 조회 할 수 있습니다. 난 그냥 매개 변수로 다시 ID를 통과 할 것 MySQL 데이터베이스로

+0

설명해 주셔서 감사합니다. 특히 앞으로 수집 할 효율성이 높아지기 시작한 금액의 짹짹으로 많은 도움이됩니다. – DanM

0

및 그러나 나는 '아주 확실하지 않은 방법 MongoDB를

같은 방법을 에게 그것을 접근하는 데이터베이스의 최신을 얻을 :) ObjectId는 타임 스탬프를 기반으로하므로 $ gt를 사용하여 새로 삽입 된 문서를 가져올 수 있습니다. 예를 들어 foo 컬렉션에 2 개의 항목이 있습니다.

> db.foo.find().limit(10); 
{ "_id" : ObjectId("4f156018ef7b8b0317a8ad18"), "a" : 2, "b" : 4, "c" : 5, "d" : 1 } 
{ "_id" : ObjectId("4f156022ef7b8b0317a8ad19"), "a" : 4, "b" : 1, "c" : 3, "d" : 2 } 

그런 다음 몇 초 후 또 다른 추가됩니다 :에 항상 인덱스가 있기 때문에

> db.foo.find({_id : {$gt : ObjectId("4f156022ef7b8b0317a8ad19")}}).limit(10); 
{ "_id" : ObjectId("4f17e667ef7b8b0317a8ad1d"), "a" : 4, "b" : 1, "c" : 3, "d" : 2 } 
> 

이 빠르게 수행합니다

>db.foo.insert( { "_id" : ObjectId("4f17e667ef7b8b0317a8ad1d"), "a" : 4, "b" : 1, "c" : 3, "d" : 2 }) 

때 쿼리 30 초 후, 당신은 마지막으로 표시 ObjectId가 ("4f156022ef7b8b0317a8ad19")를 사용할 수 있습니다 _id 필드.

관련 문제