Saya memiliki banyak koleksi 300 question
objek dalam database test
. Saya dapat berinteraksi dengan koleksi ini dengan mudah melalui shell interaktif MongoDB; namun, ketika saya mencoba untuk mendapatkan koleksi melalui Mongoose dalam aplikasi express.js saya mendapatkan array kosong.
Pertanyaan saya adalah, bagaimana saya bisa mengakses dataset yang sudah ada ini alih-alih membuatnya kembali secara ekspres? Berikut beberapa kode:
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); });
Output ini:
null [] 0
Model.collection.insert();..
mongoose.connect("mongodb://localhost/fromlab"); var Schema = mongoose.Schema; var User = mongoose.model("User", new Schema({}), "users"); User.find({}, function(err, doc){ console.log((doc)) })
Berikut adalah abstraksi dari jawaban Will Nathan jika ada yang hanya menginginkan fungsi add-in salin-tempel yang mudah:
function find (name, query, cb) { mongoose.connection.db.collection(name, function (err, collection) { collection.find(query).toArray(cb); }); }
lakukan saja
find(collection_name, query, callback);
untuk mendapatkan hasil.misalnya, jika saya memiliki dokumen {a: 1} dalam koleksi 'foo' dan saya ingin mencantumkan propertinya, saya melakukan ini:
find('foo', {a : 1}, function (err, docs) { console.dir(docs); }); //output: [ { _id: 4e22118fb83406f66a159da5, a: 1 } ]
sumber
Anda dapat melakukan sesuatu seperti ini, daripada Anda akan mengakses fungsi mongodb asli di dalam luwak:
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 }) }); });
sumber
Saya memiliki masalah yang sama dan dapat menjalankan kueri tanpa skema menggunakan koneksi Mongoose yang ada dengan kode di bawah ini. Saya telah menambahkan batasan sederhana 'a = b' untuk menunjukkan di mana Anda akan menambahkan batasan seperti itu:
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);
sumber
question
kode di atas denganfs.files
dan Anda siap melakukannya.Apakah Anda yakin telah terhubung ke db? (Saya bertanya karena saya tidak melihat port yang ditentukan)
mencoba:
mongoose.connection.on("open", function(){ console.log("mongodb is connected!!"); });
Juga, Anda dapat melakukan "show collections" di mongo shell untuk melihat koleksi dalam db Anda - mungkin coba tambahkan catatan melalui luwak dan lihat di mana akhirnya?
Dari tampilan string koneksi Anda, Anda akan melihat record di "test" db.
Semoga membantu!
sumber
questions
koleksi ketika data yang saya coba akses ada dalamquestion
koleksi. Apakah Mongoose secara otomatis membuat jamak nama koleksi / model?Hal lain yang tidak jelas, setidaknya bagi saya, adalah bahwa ketika menggunakan parameter ketiga Mongoose untuk menghindari penggantian koleksi sebenarnya dengan yang baru dengan nama yang sama,
new Schema(...)
sebenarnya hanya placeholder, dan tidak mengganggu eksisitng skema jadivar 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);});
berfungsi dengan baik dan mengembalikan semua bidang - meskipun Skema (jarak jauh) aktual tidak berisi bidang ini. Mongoose akan tetap menginginkannya sebagai
new Schema(...)
, dan variabel hampir pasti tidak akan meretasnya.sumber