2013-11-01 2 views
0

Я создал задание CRON, которое берет резервную копию базы данных каждый день.Синтаксис сложного MongoDB в Linux Сценарий оболочки

Сценарий имеет команду Mongodump с условием сброса записей, которые составляют 7 дней.

Сценарий работает нормально, пока я не добавил параметр --query в команду mongodump.

mongodump [host, port and dbparams] --query "{_id: {\$lt: ObjectId(Math.floor(new Date(Date.now() - 86400000*7)/1000).toString(16) + '0000000000000000')}}" 

Ошибка, брошенный из-за --query, в котором говорится:

assertion: 16619 code FailedToParse: FailedToParse: Expecting quoted string: offset:21 

Так что правильный способ интегрировать этот запрос в сценарии?

+0

Использует '' $ lt'' вместо '\ $ lt' help? – OneOfOne

+0

@OneOfOne Nope, '' $ lt'' без '' \ ''дает ошибку'' Первый символ в поле должен быть [A-Za-z $ _]: offset: 7''. Я добавил '' \ '', чтобы избежать' ''. –

ответ

2

Вы можете вычислить строку даты с помощью оболочки, а затем передать ее в параметр --query. Вот ваше исходное выражение Javascript и эквивалент вычисление в оболочке:

$ mongo --eval "Math.floor(new Date(Date.now() - 86400000*7)/1000).toString(16) + '0000000000000000'" 
526a7ac00000000000000000 
$ printf '%x0000000000000000' $(($(date +%s) - 86400*7)) 
526a7ac00000000000000000 

Вы бы затем использовать это в коротком сценарии, такие как следующее:

now=$(printf '%x0000000000000000' $(($(date +%s) - 86400*7))) 
mongodump --query "{_id: {\$lt: '$now'}}" 

Надеется, что это помогает,

Bruce

+1

Решение Брюса, немного проще: 'printf '% x0000000000000000' $ (date --date = '7 дней назад' +% s)' – Rafa

+0

Хорошее улучшение Rafa. –

Смежные вопросы