如果MongoDB数据库不存在,则运行命令

时间:2013-09-04 21:25:28

标签: mongodb puppet

我正在使用Vagrant实例。每当引导VM时,都会进行测试以查看MongoDB数据库是否存在。如果它不存在,Grunt任务将创建它。问题是,当数据库不存在时,我的命令总是返回1,因为Mongo只返回一个空字符串。在它上面运行一个wc -m,它总是返回1,所以我的exec永远不会被调用。

我的exec {}致电:

exec { 'grunt --gruntfile /var/www/Gruntfile.js exec:populateDatabase':
  require => Package[['grunt-cli', 'mongodb-server']],
  unless => 'mongo dbName --eval "db.getCollectionNames()" | tail -1'
}

来自除非呼叫的示例输出:

[vagrant@localhost www]$ mongo dbName --eval "db.getCollectionNames()" | tail -1
collection_one,collection_two
[vagrant@localhost www]$ mongo dbThatDoesntExist --eval "db.getCollectionNames()" | tail -1

[vagrant@localhost www]$

2 个答案:

答案 0 :(得分:1)

使用grep作为测试

grep如果匹配则返回0,如果不匹配则返回1

Grep模式

您可能需要根据mongo实际返回的内容进行调整,但这应该涵盖您:

grep "^$" # match the empty string

grep "^   $" # match a string of spaces

grep -v "^$" # match a non-empty string

amir@amir-MacPro:~$ echo "" | grep -v "^$"
amir@amir-MacPro:~$ echo $?
1

全部放在一起

exec { 'grunt --gruntfile /var/www/Gruntfile.js exec:populateDatabase':
  require => Package[['grunt-cli', 'mongodb-server']],
  unless => 'mongo dbName --eval "db.getCollectionNames()" | grep -v "^$"'
}

答案 1 :(得分:1)

您也可以直接查询数据库名称,如下所示:

$ echo $ dbname

i_am_a_db

$ mongo localhost --quiet --eval“db.getMongo()。getDBs()。databases.forEach(function(x){if(x.name =='$ dbname'){print(x.name) );}})“

i_am_a_db