2013-07-08 20 views
8

Sono nuovo su node.js e mongodb e ho il seguente problema: Ho bisogno di eliminare tutte le raccolte dal mio file mongodb dal file node.js. Ho una tale funzione:Come eliminare tutte le raccolte tramite mongodb e node.js?

service.dropCollections = function(db, colls){ 
    for(var i = 0; i < colls.length; i++){ 
    var name = colls[i].name; 
    db.dropCollection(name, function(err) { 
     if(!err) { 
      console.log(name + " dropped"); 
     } else { 
      console.log("!ERROR! " + err.errmsg); 
     } 
    }); 
    } 
} 

e sto usando nella seguente funzione:

service.clearDB = function() { 
var MongoClient = require('mongodb').MongoClient 
, format = require('util').format;  

    MongoClient.connect('mongodb://127.0.0.1:27017/shiny_d', function(err, db){ 
    if(err) throw err; 
    db.collectionNames(function(err, collections){ 
     if(!err){ 
      service.dropCollections(db, collections); 
     } else { 
      console.log("!ERROR! "+ err.errmsg); 
     } 
     service.showCollections(); 
    }); 
    }); 
} 

Come uscita devo

ERRORE! ns non trovato

shiny_db.physicalinfos

so cosa fare adesso. Sarò molto grato per il tuo aiuto.

+0

Non cancellare nulla che inizi con 'system' come quelli riservati per MongoDB. – WiredPrairie

+0

Puoi dirmi di evitarli? –

+0

controlla solo se la stringa inizia con 'system'. – WiredPrairie

risposta

3

ho trovato una risposta. Prima di tutto ho sbagliato nella mia connessione dovrebbe essere come il seguente: 'mongodb://127.0.0.1:27017/shiny_db'. Il secondo errore era nel nome della collezione. Era come 'db_name.coll_name', ecco perché db.dropCollection(name, callback) non è stato in grado di trovare una raccolta particolare e, a causa di ciò, ho avuto l'errore ns not found. Quindi ho usato il seguente meccanismo per separare nome_db da nome_cart:

var name = colls[i].name.substring('shiny_db.'.length); e ho aggiunto il controllo per la raccolta "sistema".

codice finale si presenta come segue:

service.clearDB = function() { 
    var MongoClient = require('mongodb').MongoClient 
    , format = require('util').format;  

    MongoClient.connect('mongodb://localhost/shiny_db', function(err, db) { 
     if(err) throw err; 
     db.collectionNames(function(err, collections){ 
      if(!err){ 
       service.dropCollections(db, collections);     
      } else { 
       console.log("!ERROR! "+ err.errmsg); 
      } 
     }); 
    }); 
} 
service.dropCollections = function(db, colls){ 
    for(var i = 0; i < colls.length; i++){ 
     var name = colls[i].name.substring('shiny_db.'.length); 

     if (name.substring(0, 6) !== "system") { 
      db.dropCollection(name, function(err) { 
       if(!err) { 
        console.log(name + " dropped"); 
       } else { 
        console.log("!ERROR! " + err.errmsg); 
       } 
      }); 
     } else { 
      console.log(name + " cannot be dropped because it's a system file"); 
     }  
    } 
} 

auguro che possa aiutare qualcuno!

7

Non è più veloce, più facile e meno soggetto a errori se si interrompe l'intero database?

db.dropDatabase(); 

Almeno dal Mongo CLI, ogni volta che si accede a un inesistente DB, sarà insistette il presto si crea dati. È come eliminare tutte le raccolte da esso.

Non ho provato MongoDB per niente tranne che per studiare ancora, quindi non so molto delle autorizzazioni. Quindi, probabilmente l'unico problema di lasciar cadere l'intero DB sarebbero le autorizzazioni dei tuoi utenti che andrebbero perse (credo).

Se questo script che si sta tentando di creare non è per la produzione, allora si è pronti a rilasciare il DB.

+0

beh, non era il mio obiettivo;) –

0

listCollections fornisce una serie di nomi di raccolta come stringhe.

Sembra che si può confondere con qualcosa che restituisce un array di oggetti da collezione come forse db.collections()

+0

Ma quale differenza cosa usare per definire un nome collezione? Ho solo bisogno di nomi di collezioni per usarli come argomenti in 'db.dropCollection (name, callback)' –

+0

se ti restituisce un oggetto che devi usare obj.name per ottenere il nome. se ti restituisce i nomi, non dovresti usare name.name. –

+0

Bene, ho controllato cosa restituisce 'collectionNames' e restituisce una raccolta con oggetto, che ha un campo" nome ". Ma la tua risposta mi porta un'idea che ha avuto successo, grazie mille! –

Problemi correlati