data engineering

mongodb에서 js function만들어놓고 사용하는법.

qkqhxla1 2017. 12. 4. 17:23

몽고디비 작업을 할때 가장 익숙한 파이썬을 쓰기 위해 pymongo를 사용하는데, 종종 pymongo에는 없는것 같은 기능들이 있다. (구글링 실력이 낮은지 찾아도 안 나온다...) 몽고디비에서 js를 사용할수 있는데 js를 이용한 방법들이 몽고디비 공식홈페이지에서 소개될 만큼 몽고디비 프로그래밍을 위한 주 언어(??) 가 js인것같아서 js를 이용한 방법을 찾아서 사용했더니 되었다.


pymongo로 만들려고 했던것.
특정 컬렉션을 한 db에서 다른 db로 renamecollection하기. (구글링 해도 못 찾겠다..) 프로그래밍적으로 find({})로 다 가져와서 다른 디비에 복사할수있으나, 다루는 데이터가 몇천,억단위이므로 몽고디비 명령어가 훨씬 더 빠르기에, pymongo에서 renamecollection으로 다른 디비로 옮기는걸 찾았으나 없어서 포기했다. (단순히 rename하는 예제만 있음.)


js function 만드는 법은 여기 있다 : https://docs.mongodb.com/manual/tutorial/store-javascript-function-on-server/


서버에 ssh로 접속해서 몽고디비 쉘로 들어간다. 그 후에 'use db이름' 으로 사용할 디비를 선택해준다. 디비를 선택 안하고 함수를 만들면 test라는 디비에 만들어진 함수가 들어간다. 

그리고 메모장이나 아무 에디터를 열고 js코딩을 한다... 아래는 예시

db.system.js.save(
    {
        _id : 'renamecollection_to_anotherdb',
        value : function() {
            var collection_list = ['test_collection1', 'rarara']
            collection_list.forEach(function(collection){ db.adminCommand( { renameCollection: "test1."+collection, to: "test2."+collection+'_success' } ) });
        }
    }
)

이렇게 짠 다음 위에서 연 몽고디비의 쉘에다 복붙을 한다. 뭔가 문법적으로 틀리면 아무것도 안 나오고

제대로 잘 짰으면 성공했다고 나온다. 이미 있는 함수를 수정할 경우 수정했다고 나오고, 에러인 경우 에러가 나온다.


성공한 경우 해당 디비의 System폴더 안에 System.js라는게 하나 생기고 이 안에 함수가 있다. (위에서 말했지만 디비를 선택하지않고 만들면 test라는 디비에 들어간다.)

그 후에


db.loadServerScripts();

renamecollection_to_anotherdb();


로 쉘에서 실행해주는데 공식홈페이지에 써있듯이 db.loadServerScripts();는 system.js를 가져온다는 거랜다..


엄청 쉬워보이는데 처음 해보는거라 오래 걸려서 써놓음..