basante
basante

Reputation: 545

Multiple databases and collections mongodump

I have something like this:

dbs=$(mongo --quiet --eval "db.getMongo().getDBNames()" --host exemple.com | \ 
            grep '"' | tr -d '"' | tr -d ',')

for db in $dbs; do
    cols=$(mongo --quiet --eval "print(db.getCollectionNames())" $db \
                  --host exemple.com | tr ',' ' ')
    for col in $cols; do
        mongodump --host example.com -q "{_id:{\$gt:$oid}}" \
                   -d $dbs -c $col --out /data/
   done
done

I'm getting:

positional arguments not allowed

How can I use mongodump for all collections in all databases ?

Upvotes: 4

Views: 15862

Answers (3)

Cong Wu
Cong Wu

Reputation: 482

you may give this script a try, which provides a function called dump_by_filter

#!/bin/bash

# sudo apt install mongo-tools
# sudo apt install mongo-client

# dump(uri:string,col:string,out:string)
function dump {
    local uri=$1
    local col=$2
    local out=$3

    mongodump --forceTableScan  --uri=$uri  -c $col --out $out
}

# load(uri:string,dir:string)
function load {
    local uri=$1
    local dir=$2
    mongorestore --drop --uri=$uri $dir
}

# list_col(uri:string,filter:string)
function list_col {
   local res=`echo show collections |mongo $1 --quiet |grep $2` 
   echo $res
}

# dump(uri:string,filter:string,out:string)
function dump_by_filter {
    local uri=$1
    local filter=$2
    local out=$3

    local cols=$(list_col $uri $filter)
    for col in $cols; do
        dump $uri $col $out
        echo dump $col to $out
    done
}

FROM_URL="mongodb://127.0.0.1:27017/a"
TO_URL="mongodb://127.0.0.1:27017/b"

DIR="./out"
dump_by_filter $FROM_URL xx $DIR
load $TO_URL $DIR

i place it here

Upvotes: 0

Ankit Kumar Rajpoot
Ankit Kumar Rajpoot

Reputation: 5590

For multiple database.

dbs=( z2p stackoverflow poststodos)  
for c in ${dbs[@]}
do
mongodump -d  $c  --out ~/backups/dump
done

Upvotes: 2

felix
felix

Reputation: 9285

Here is a working script:

  dbs=`mongo --eval "db.getMongo().getDBNames()" | grep '"' | tr -d '",' `


    for db in $dbs; do
        col=`mongo  $db --host example.com --quiet --eval "db.getCollectionNames()" | tr -d ',"[]' `
        for collection in $col; do
          mongodump --host example.com -q '{_id: {$gt: 10}}' -d $db -c $collection --out dump

       done
    done

from mongodump documentation :

--query , -q

Provides a JSON document as a query that optionally limits the documents included in the output of mongodump. You must enclose the query in single quotes (e.g. ') to ensure that it does not interact with your shell environment.

Upvotes: 8

Related Questions