web-dev-qa-db-ja.com

Mongooseで既存のコレクションにアクセスする方法は?

データベースに300個のquestionオブジェクトの大規模なコレクションtestがあります。 MongoDBのインタラクティブシェルを使用して、このコレクションと簡単にやり取りできます。ただし、express.jsアプリケーションでMongooseを使用してコレクションを取得しようとすると、空の配列が取得されます。

私の質問は、エクスプレスで再作成するのではなく、この既存のデータセットにアクセスするにはどうすればよいですか?コードは次のとおりです。

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

この出力:

null [] 0
118
theabraham

Mongooseは、スキーマの下で、またはモデルを宣言するときに3番目の引数としてコレクション名を指定する機能を追加しました。それ以外の場合は、モデルにマップする名前で指定された複数形バージョンを使用します。

スキーママッピングされた次のようなものを試してください。

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

またはマップされたモデル:

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

コピーアンドペーストの簡単なアドイン機能が必要な場合は、ウィルネイサンの答えを抽象化します。

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

単にfind(collection_name, query, callback);を実行して、結果を与えます。

たとえば、コレクション 'foo'にドキュメント{a:1}があり、そのプロパティを一覧表示する場合、次のようにします。

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

Mongoose内のネイティブmongodb関数にアクセスするよりも、次のようなことができます。

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

});
19
Leo Ribeiro

同じ問題があり、既存のMongoose接続と以下のコードを使用してスキーマレスクエリを実行できました。このような制約を追加する場所を示すために、単純な制約「a = b」を追加しました。

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);
14
Will Nathan

データベースに接続しましたか? (指定されたポートが表示されないため、お願いします)

試してください:

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

また、mongo Shellで「コレクションの表示」を実行して、db内のコレクションを表示できます。mongooseを介してレコードを追加して、最終的にどこに表示されるかを確認してください。

接続文字列の外観から、「test」dbにレコードが表示されるはずです。

それが役に立てば幸い!

6
busticated

少なくとも私には明らかではなかった他の何かは、Mongooseの3番目のパラメーターを使用して、実際のコレクションを同じ名前の新しいコレクションに置き換えないようにする場合、new Schema(...)は実際にはプレースホルダーであり、 t既存のスキーマに干渉する

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

実際に(リモート)スキーマにこれらのフィールドが含まれていない場合でも、正常に機能し、すべてのフィールドを返します。 Mongooseは依然としてnew Schema(...)としてそれを必要とし、変数はほとんど確実にそれをハッキングしません。

2
Bart