Mongo 取自列表 bash 脚本的 eval 参数
Mongo eval arguments taken from a list bash script
我正在编写 bash 脚本,并希望使用 for 循环遍历 mongo 中的特定集合并执行计数。如果这些特定集合中的任何一个不为零,则中断循环。
我已经在我的脚本中初始化了这个变量(假设连接正常):
MONGO_EVAL="mongo prod $MONGO_CONN_CONF --quiet --eval"
以及特定集合的列表(在上面初始化,在脚本的早期阶段):
db_collections=(collectionA collectionB collectionC....)
然后遍历 for 循环并计算每个集合中的文档数。
for str in ${db_collections[@]}; do
$MONGO_EVAL 'db.$db_collections.count();'
done
如何正确操作?
应该是这样的:
db_collections=(collectionA collectionB collectionC....)
for str in ${db_collections[@]}; do
mongo "$MONGO_CONN_CONF" --quiet --eval "db.${str}.count();"
done
或
for str in ${db_collections[@]}; do
mongo "$MONGO_CONN_CONF" --quiet --eval "db.getCollection('${str}').count();"
done
或
mongo "$MONGO_CONN_CONF" --quiet --eval "for (let c of ['collectionA', 'collectionB', 'collectionC']) db.getCollection(c).count();"
注意,必须使用双引号("
),否则${str}
不会被变量值替换。
关于你的实际问题“如果这些特定集合中的任何一个是non-zero,那么打破循环”如果可能是这样的话:
for (let c of ['collectionA', 'collectionB', 'collectionC']) {
let count = db.getCollection(c).count();
if (count > 0) break;
}
请记住,这个循环实际上什么都不做,只是计数并可能退出。我假设您至少还需要 print(c)
或类似的东西。
我正在编写 bash 脚本,并希望使用 for 循环遍历 mongo 中的特定集合并执行计数。如果这些特定集合中的任何一个不为零,则中断循环。
我已经在我的脚本中初始化了这个变量(假设连接正常):
MONGO_EVAL="mongo prod $MONGO_CONN_CONF --quiet --eval"
以及特定集合的列表(在上面初始化,在脚本的早期阶段):
db_collections=(collectionA collectionB collectionC....)
然后遍历 for 循环并计算每个集合中的文档数。
for str in ${db_collections[@]}; do
$MONGO_EVAL 'db.$db_collections.count();'
done
如何正确操作?
应该是这样的:
db_collections=(collectionA collectionB collectionC....)
for str in ${db_collections[@]}; do
mongo "$MONGO_CONN_CONF" --quiet --eval "db.${str}.count();"
done
或
for str in ${db_collections[@]}; do
mongo "$MONGO_CONN_CONF" --quiet --eval "db.getCollection('${str}').count();"
done
或
mongo "$MONGO_CONN_CONF" --quiet --eval "for (let c of ['collectionA', 'collectionB', 'collectionC']) db.getCollection(c).count();"
注意,必须使用双引号("
),否则${str}
不会被变量值替换。
关于你的实际问题“如果这些特定集合中的任何一个是non-zero,那么打破循环”如果可能是这样的话:
for (let c of ['collectionA', 'collectionB', 'collectionC']) {
let count = db.getCollection(c).count();
if (count > 0) break;
}
请记住,这个循环实际上什么都不做,只是计数并可能退出。我假设您至少还需要 print(c)
或类似的东西。