Mongoose ile önceden var olan bir koleksiyona nasıl erişilir?


139

questionBir veritabanında 300 nesne büyük bir koleksiyon var test. Bu koleksiyonla MongoDB'nin etkileşimli kabuğu üzerinden kolayca etkileşim kurabilirim; Ancak, bir express.js uygulamasında Mongoose aracılığıyla koleksiyonu almaya çalıştığınızda boş bir dizi olsun.

Benim sorum şu anda mevcut olan bu veri kümesine hızlı bir şekilde yeniden oluşturmak yerine nasıl erişebilirim? İşte bazı kod:

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); });

Bu çıktılar:

null [] 0

Yanıtlar:


252

Mongoose, koleksiyon adını şema altında veya modeli bildirirken üçüncü argüman olarak belirleme yeteneğini ekledi. Aksi takdirde, modelle eşlediğiniz adla verilen çoğullaştırılmış sürümü kullanır.

Şema eşlemeli aşağıdakine benzer bir şey deneyin:

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

veya eşlenen model:

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

9
Bu bilgileri dokümanların neresinde bulabilirim? Bu gerçekten sarsıldı, ancak çoğul şeyi açıklayan bir yer yok.
StudioWorks

Merhaba, @calvinfo Koleksiyon adını çalışma zamanında nasıl değiştirebilirim? 5 UserSchema koleksiyonum var ve her birine farklı bir ad vermek istiyorum Örn: users_server1, users_server2, users_server3 ...
Ragnar

1
Pleae örnek sorgu sağlar, örneğinModel.collection.insert();..
Steve K ile

6
Burada da, bu sorunu
anlamak için

3
Bu benim için çalıştı. Tek kaydettiğim bir kullanıcı koleksiyonum vardı. Firavun faresi ile erişim elde etmek için yaptımmongoose.connect("mongodb://localhost/fromlab"); var Schema = mongoose.Schema; var User = mongoose.model("User", new Schema({}), "users"); User.find({}, function(err, doc){ console.log((doc)) })
jack blank

62

İşte kimse kolay bir kopyala yapıştır eklenti işlevi istiyorsa Will Nathan'ın cevabının bir soyutlaması:

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

sadece find(collection_name, query, callback);sonuç verilecek.

örneğin, bir koleksiyon 'foo' {a: 1} bir belge varsa ve özelliklerini listelemek istiyorum, bunu yapmak:

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

Bu, bir API üzerinde entegrasyon testleri çalıştırırken çok yararlıdır
Greg

merhaba, bu atomik bir işlem mi? Belgeyi geri arama işlevinde kaydetmeye çalıştığımı varsayalım. bu atomik olacak mı?
Maulik Soneji

23

Mongoose içindeki yerel mongodb işlevlerine erişeceğinizden daha böyle bir şey yapabilirsiniz:

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
        })
    });

});

1
Mükemmel cevap!
CandleCoder

15

Ben de aynı sorunu vardı ve aşağıdaki kod ile mevcut bir Mongoose bağlantısı kullanarak şema olmadan bir sorgu çalıştırmak mümkün. Böyle bir kısıtlama nereye ekleyeceğinizi göstermek için basit bir 'a = b' kısıtlaması ekledim:

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
Tam da aradığım şey bu, çünkü mongoose'un herhangi bir gridFS desteği yok. Ben gridfs (gridstore) dosya meta verileri kapmak için bu yöntemi kullanın. questionYukarıdaki kodu yerine fs.fileskoymanız yeterlidir.
k00k

7

Db'ye bağlandığınızdan emin misiniz? (Belirtilen bir port görmediğim için soruyorum)

Deneyin:

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

Ayrıca, db içindeki koleksiyonları görmek için mongo kabuğunda bir "koleksiyonları göster" yapabilirsiniz - belki mongoose yoluyla bir kayıt eklemeyi deneyin ve nerede bittiğini görmek?

Bağlantı dizesinin görünümünden, kaydı "test" db dosyasında görmelisiniz.

Umarım yardımcı olur!


4
İlginçtir ki, questionserişmeye çalıştığım veriler bir koleksiyondayken aslında bir koleksiyondaki bilgileri questiondepolar. Mongoose koleksiyon / model adlarını otomatik olarak çoğuluyor mu?
theabraham

Evet bence öyle ... ha! Kendime yeni başlıyorum, bu yüzden tüm köşe ve çatlakları keşfetmedim ... ama Google Grupları'nda dönerken bu kestane esintisini gördüğümü hatırlıyorum.
12'de büstü

3

En azından benim için açık olmayan başka bir şey, Mongoose'un üçüncü parametresini kullanarak gerçek koleksiyonu aynı ada sahip yeni bir koleksiyonla değiştirmekten kaçınmak new Schema(...), aslında sadece bir yer tutucuydu ve exisitng'e müdahale etmemesiydi. şema öyle

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);});

iyi çalışır ve tüm alanları döndürür - gerçek (uzak) Şema bu alanlardan hiçbirini içermese bile. Firavun faresi hala bunu isteyecek new Schema(...)ve bir değişken neredeyse kesinlikle onu hacklemeyecek.


1
bana 'koleksiyon adı dize olmalı' hatası veriyor, Düzenle: 'calvinfo' cevabı olarak, model adını yapıcıda koleksiyon adı vermek istiyorsanız, sadece koleksiyon modelini nesne modeline değil, dize formuna geçirin. bu şekilde düzenlerseniz cevabınız doğru olacaktır, var User = mongoose.model ('Kullanıcı', yeni Şema ({url: String, text: String, id: Number}, 'users')); // koleksiyon adı; User.find ({}, function (err, data) {console.log (err, data, data.length);});
Kaan Erkoç
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.