2014-08-28 4 views
14

우선, 나는 mongodb를 매우 신작했습니다. 여기에 대한 해결책을 찾을 수 없었던 나의 질문이있다.모든 Mongo 콜렉션을 반복하고 쿼리를 실행하십시오.

3 가지 컬렉션이 있다고 가정 해 보겠습니다.

mongos> show collections 
collectionA 
collectionB 
collectionC 

나는이 데이터베이스 산업사 모든 컬렉션을 반복 처리하는 스크립트를 생성하고 이러한 컬렉션을 각각의 마지막에 삽입 타임 스탬프를 찾고 싶어요. 몽고 안에서 일하는 것은 다음과 같습니다.

var last_element = db.collectionA.find().sort({_id:-1}).limit(1); 
printjson(last_element.next()._id.getTimestamp()); 
ISODate("2014-08-28T06:45:47Z") 

1. 문제 (모든 컬렉션을 반복하되)

STH 할 수있는 가능성이있다. 처럼.

var my_collections = show collections; 
my_collections.forEach(function(current_collection){ 
    print(current_collection); 
}); 

여기에서 문제는 my_collections에 대한 할당이 작동하지 않습니다. SyntaxError: Unexpected identifier이 나옵니다. '쇼'진술서를 인용해야합니까? 심지어 가능할까요?

2. 문제점

난 이렇게 1 문제를 해결할 수있다 (JS의 VAR의 컬렉션을 저장)

error hasNext: false at src/mongo/shell/query.js:124

다음 last_element.next() 다음 오류를 생성

var my_collections = ["collectionA", "collectionB", "collectionC"]; 
my_collections.forEach(function(current_collection){ 
    var last_element = db.current_collection.find().sort({_id:-1}).limit(1); 
    print(current_collection); 
    printjson(last_element.next()._id.getTimestamp()); 
}); 

을 last_element가 올바르게 저장되지 않은 것 같습니다.

내가하는 일에 대한 제안은 무엇입니까 ??


UPDATE

Neils의 대답은이 솔루션에 저를지도한다. 그의 코드 외에도 함수 getTimestamp이 실제로 존재하는지 확인해야했습니다. 일부 '가상'컬렉션의 경우 _id 속성이없는 것 같습니다.

db.getCollectionNames().forEach(function(collname) { 
    var last_element = db[collname].find().sort({_id:-1}).limit(1); 
    if(last_element.hasNext()){ 
     var next = last_element.next(); 
     if(next._id !== undefined && typeof next._id.getTimestamp == 'function'){ 
      printjson(collname + " >> "+next._id.getTimestamp()); 
     }else{ 
      print(collname + " undefined!! (getTimestamp N/A)") 
     } 
    } 
}); 
+1

여기에 명확히 설명되어 있습니다. '.getTimeStamp()'가 실패하는 유일한 이유는 모든 문서의 기본 키'_id' 필드에 실제로 ObjectId가 없다는 것입니다. MongoDB는 "schemaless"이기 때문에 MongoDB가 필드에서 타입을 혼합하도록 허용하는 것처럼 ** 이것을 실제로보아야합니다 ** 당신은 ** 이것을 일반적인 연습으로해서는 안되며 실제로 이것을 수정해야합니다 이는 항목을 일관되게 만들기 위해 발생합니다. –

+0

그 고마워요! 명시된 바와 같이 나는 mongo에 상당히 익숙하며 관계형 DB 배경에서 왔습니다. 나는 아직도이 컬렉션이 어떻게 생성되었는지, 왜 ObjectID가 없는지 잘 모르겠습니다. 당신이 진술 한대로 나는 이것을 고칠 필요가있을 것이며 왜 그리고 어떻게 이해해야 할 필요가 있습니다. 감사! – cb0

답변

25

이 여러분을 위해이 일을하는 db.getCollectionNames() 도우미 방법이있다. 당신은 아마도에서 .hasNext() 검사가 가능한 빈 컬렉션에 대한 수용 할

db.getCollectionNames().forEach(function(collname) { 
    // find the last item in a collection 
    var last_element = db[collname].find().sort({_id:-1}).limit(1); 
    // check that it's not empty 
    if (last_element.hasNext()) { 
     // print its timestamp 
     printjson(last_element.next()._id.getTimestamp()); 
    } 
}) 

: 그런 다음 코드를 구현할 수 있습니다.

+0

모든 호출이 동기 인 셸 환경에서만이 작업이 실제로 안전하다고 말할 수 있습니다. 비동기 드라이버 환경에서이 솔루션은 위험합니다 (많은 연속 쿼리가 연속적으로 발생합니다). – zamnuts

+0

@zamnuts 비동기 환경에서 목록 및 데이터 스트림을 안전하게 처리 할 수있는 방법은 많습니다. 각 반복을 알리기 위해 콜백을 인식하면됩니다. 당신이 이것에 대해 확실하지 않다면, 당신은 언제나 질문을 할 수 있고, 누군가는 당신에게 그것을하는 법을 보여줄 것입니다. –

+0

나를 위해 작동하지 않습니다 : '찾을 수없는 메서드 '찾기'에서 정의되지 않은 ... ' mongo 버전 2.6.6 –

관련 문제