2011-04-26 13 views
88

Ho una vasta collezione di 300 oggetti question in un database test. Posso interagire facilmente con questa collezione attraverso la shell interattiva di MongoDB; tuttavia, quando provo ad ottenere la raccolta tramite Mongoose in un'applicazione express.js, ottengo un array vuoto.Come accedere ad una collezione preesistente con Mongoose?

La mia domanda è, come posso accedere a questo set di dati già esistente invece di ricrearlo in espresso? Ecco po 'di codice:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

mongoose.connect('mongodb://localhost/test'); 
mongoose.model('question', new Schema({ url: String, text: String, id: Number })); 

var questions = mongoose.model('question'); 
questions.find({}, function(err, data) { console.log(err, data, data.length); }); 

Questo uscite:

null [] 0 

risposta

181

Mongoose aggiunta la possibilità di specificare la collezione nome sotto lo schema, o come terzo argomento quando si dichiara il modello. Altrimenti userà la versione pluralizzata data dal nome che mappi al modello.

Provare qualcosa come il seguente, sia schema-mappato:

new Schema({ url: String, text: String, id: Number}, 
      { collection : 'question' }); // collection name 

o modello mappato:

mongoose.model('Question', 
       new Schema({ url: String, text: String, id: Number}), 
       'question');  // collection name 
+5

Dove posso trovare queste informazioni nella documentazione? Questo è davvero difficile, ma non c'è posto per spiegare la cosa al plurale. – StudioWorks

+0

Salve, @calvinfo come posso modificare il nome della raccolta in fase di esecuzione? Ho 5 collezioni di UserSchema e voglio dare a ciascuno un nome diverso Ad esempio: users_server1, users_server2, users_server3 ... – Ragnar

+1

Pleae fornire query di esempio, ad es. con 'Model.collection.insert(); .. ' – nottinhill

5

Sei sicuro avete collegato al db? (Lo chiedo perché non vedo una porta specificata)

prova:

mongoose.connection.on("open", function(){ 
    console.log("mongodb is connected!!"); 
}); 

Inoltre, si può fare un "mostra collezioni" in guscio Mongo per vedere le collezioni all'interno del vostro db - forse provare ad aggiungere un record via mangusta e vedere dove finisce?

Dall'aspetto della stringa di connessione, dovresti vedere il record nel db "test".

Spero che aiuti!

+3

Interessante, in realtà è memorizzare le informazioni in una collezione 'questions' quando i dati che sto cercando per accedere è in una raccolta 'domanda'. Mongoose plana automaticamente i nomi di collezione/modello? – theabraham

+0

Sì, penso che lo faccia ... ah! Sto solo iniziando da solo, quindi non ho esplorato tutti gli angoli e le crepe ... ma ricordo di aver visto quella leggera brezza castana mentre giravo i Google Gruppi. – busticated

12

Ho avuto lo stesso problema ed è stato in grado di eseguire una query senza schema utilizzando una connessione Mongoose esistente con il codice seguente. Ho aggiunto un semplice vincolo 'a = b' per mostrare dove si dovrebbe aggiungere un tale vincolo:

var action = function (err, collection) { 
    // Locate all the entries using find 
    collection.find({'a':'b'}).toArray(function(err, results) { 
     /* whatever you want to do with the results in node such as the following 
      res.render('home', { 
       'title': 'MyTitle', 
       'data': results 
      }); 
     */ 
    }); 
}; 

mongoose.connection.db.collection('question', action); 
+1

Questo è esattamente quello che stavo cercando perché mangusta non ha alcun supporto gridFS. Io uso questo metodo per afferrare i metadati dei file da gridfs (gridstore). Basta sostituire 'domanda' nel codice qui sopra con' fs.files' e sei a posto. – k00k

41

Ecco un'astrazione della risposta di Will Nathan se qualcuno vuole solo una funzione add-in facile copia-incolla:

function find (collec, query, callback) { 
    mongoose.connection.db.collection(collec, function (err, collection) { 
    collection.find(query).toArray(callback); 
    }); 
} 

semplicemente find(collection_name, query, callback); da dare il risultato.

per esempio, se ho un documento {a: 1} in una collezione 'foo' e voglio elencare le sue proprietà, faccio questo:

find('foo', {a : 1}, function (err, docs) { 
      console.dir(docs); 
     }); 
//output: [ { _id: 4e22118fb83406f66a159da5, a: 1 } ] 
+0

Questo è molto utile quando si eseguono test di integrazione su un'API – Greg

+0

Questa è la risposta giusta. –

+0

ciao, si tratta di un'operazione atomica? Supponiamo di provare a salvare il documento nella funzione di callback. sarà atomico? –

1

Un'altra cosa che non era evidente, almeno per me, era che il quando si utilizza Il terzo parametro di Mongoose per evitare di sostituire la raccolta effettiva con una nuova con lo stesso nome, lo new Schema(...) è in realtà solo un segnaposto e non interferisce con lo schema di esisitng in modo da

var User = mongoose.model('User', new Schema({ url: String, text: String, id: Number}, { collection : 'users' })); // collection name; 
User.find({}, function(err, data) { console.log(err, data, data.length);}); 

funziona correttamente e restituisce tutti i campi, anche se lo schema (remoto) effettivo non contiene nessuno di questi campi. Mongoose lo vorrà ancora come new Schema(...) e una variabile quasi certamente non lo hackerà.

+1

dà 'nome della raccolta deve essere stringa' errore a me, Modifica: come "risposta di calvinfo", se si desidera assegnare il nome della raccolta nel costruttore del modello si passa semplicemente il nome della raccolta in forma stringa non come modello oggetto. quindi la tua risposta sarà vera se modifica come questa, var Utente = mongoose.model ('Utente', nuovo schema ({url: String, testo: stringa, id: numero}, 'utenti')); // nome della collezione; User.find ({}, funzione (err, data) {console.log (err, data, data.length);}); –

10

Si può fare qualcosa di simile, di quello che si accedere alle funzioni mongodb native all'interno mangusta:

var mongoose = require("mongoose"); 
mongoose.connect('mongodb://localhost/local'); 

var connection = mongoose.connection; 

connection.on('error', console.error.bind(console, 'connection error:')); 
connection.once('open', function() { 

    connection.db.collection("YourCollectionName", function(err, collection){ 
     collection.find({}).toArray(function(err, data){ 
      console.log(data); // it will print your collection data 
     }) 
    }); 

}); 
+0

bello !! esattamente quello che stavo cercando –

Problemi correlati