programing

모든 Mongo 컬렉션을 루프하고 쿼리 실행

mytipbox 2023. 7. 17. 22:38
반응형

모든 Mongo 컬렉션을 루프하고 쿼리 실행

우선, 몽고드는 처음입니다.여기 제가 해결책을 찾지 못한 질문이 있습니다.

제가 세 가지 다른 컬렉션을 가지고 있다고 가정해 보겠습니다.

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")

문제(모든 컬렉션에서 반복)

뭔가를 할 수 있는 가능성이 있습니까?

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

여기서 문제는, 다음과 같은 과제입니다.my_collections작동하지 않습니다.알겠습니다SyntaxError: Unexpected identifier'쇼' 문구를 인용해야 합니까?그게 가능할까요?

문제(수집을 jsvar에 저장)

다음을 수행하여 문제 1을 해결할 수 있습니다.

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.next()다음 오류가 발생합니다.

오류 hasNext: src/mongo/shell/query.js:124에서 false가 발생했습니다.

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

제가 뭘 잘못하고 있는지에 대한 제안이 있나요?


갱신하다

닐스의 대답은 저를 이 해결책으로 이끌었습니다.그의 코드 외에도 나는 기능이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)")
        }
    }
});

있습니다.db.getCollectionNames()당신을 위해 이것을 하는 도우미 메소드.그런 다음 코드를 구현할 수 있습니다.

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());
    }
})

당신은 아마도 또한 원할 것입니다..hasNext()가능한 빈 컬렉션을 제공하기 위해 체크인합니다.

다음 스크립트를 사용하여 모든 레코드에 있는 컬렉션 이름의 이름을 변경합니다.

    db = db.getSiblingDB("admin");
dbs = db.runCommand({ "listDatabases": 1 }).databases;
dbs.forEach(function(database) {
    db = db.getSiblingDB(database.name);
    db.currentname.renameCollection("newname");
});

언급URL : https://stackoverflow.com/questions/25543452/loop-through-all-mongo-collections-and-execute-query

반응형