alias não funciona com o meu comando mongo --eval

1

Eu tenho o seguinte comando mongo shell para excluir todos os usuários que não são administradores

mongo --eval 'db.users.remove({group:{$ne:"admin"}})' collection

Isso funciona.

Eu quero criar um alias para este comando, mas as seguintes variações possíveis que tentei me deram os erros correspondentes

  1. alias mdelna="mongo --eval 'db.users.remove({group:{$ne:"admin"}})' collection"

    SyntaxError: Unexpected token :

  2. alias mdelna="mongo --eval 'db.users.remove({group:{ " $ne " :"admin"}})' collection"

    SyntaxError: Unexpected token :

  3. alias mdelna="mongo --eval 'db.users.remove({group:{ " $ " ne:"admin"}})' collection"

    ReferenceError: admin is not defined

  4. alias mdelna="mongo --eval 'db.users.remove({group:{ " $ " ne: ' admin ' }})' collection"

    ReferenceError: admin is not defined

  5. alias mdelna="mongo --eval 'db.users.remove({group:{ " $ " ne: admin }})' collection"

    ReferenceError: admin is not defined

  6. alias mdelna="mongo --eval 'var admin="admin";db.users.remove({group:{ " $ " ne: admin }})' collection"

    Isso não gera erros . Mas também não faz nada. Eu verifico o banco de dados e ele não fez o seu trabalho.

O que eu poderia estar fazendo de errado?

    
por laggingreflex 06.08.2014 / 13:47

1 resposta

1

Isto é tudo sobre como escapar coisas para que o comando completo seja passado corretamente a partir do bash. Especificamente, o $ será um problema, pois o bash tentará substituí-lo pela variável $ne (que não existe). Aqui está a versão que funcionou para mim:

alias mdelna="mongo --eval 'db.users.remove({group:{\$ne:\"admin\"}})' collection"

Eu não mantenho as regras para os vários caracteres especiais na minha cabeça, e é muito difícil extrair as regras dos documentos, então a maneira rápida e suja de testar esse tipo de coisa é ver o que o eco retorna quando você passa o mesmo argumento. Aqui estão dois para comparação:

$ echo "mongo --eval 'db.users.remove({group:{$ne:\"admin\"}})' collection"
mongo --eval 'db.users.remove({group:{:"admin"}})' collection

Observe a falta do $ne - ele foi substituído pelo conteúdo vazio da variável inexistente em bash . Agora, escape do $ , veja se isso resolve:

$ echo "mongo --eval 'db.users.remove({group:{\$ne:\"admin\"}})' collection"
mongo --eval 'db.users.remove({group:{$ne:"admin"}})' collection

E agora parece muito mais com o que estamos almejando - você pode ver como você pode aumentar gradualmente com base na saída até obter o que precisa.

    
por 07.08.2014 / 11:59