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


139

questionデータベースに300のオブジェクトの大規模なコレクションがあります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

回答:


251

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

9
ドキュメントのどこにこの情報がありますか?これは本当に役に立ちましたが、複数形を説明する場所はありません。
StudioWorks 14

こんにちは、@ calvinfo実行時にコレクション名を変更するにはどうすればよいですか?私はUserSchemaの5つのコレクションを持っていて、それぞれに異なる名前を付けたいと思います。例:users_server1、users_server2、users_server3 ...
Ragnar

1
Pleaeはで例えば、クエリの例を提供Model.collection.insert();..
スティーブ・K

6
ここでは同じ、私はドキュメントがここで発見され、この問題を考え出す多くの時間を費やすmongoosejs.com/docs/guide.html#collection
ElvinD

3
これでうまくいきました。mongorestoreしたユーザーコレクションがありました。マングースとそれへのアクセスを取得するために私がやった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)) })
ジャック空白の

61

簡単なコピーと貼り付けのアドイン機能を必要とする人がいる場合のWill Nathanの回答の抽象化を次に示します。

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 } ]

これは、APIで統合テストを実行するときに非常に役立ちます
Greg

こんにちは、これはアトミック操作ですか?次に、ドキュメントをコールバック関数に保存しようとします。これはアトミックですか?
Maulik Soneji 2017

23

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

});

1
完璧な答えです!
CandleCoder 2018年

15

同じ問題があり、既存の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);

1
mongooseはgridFSをサポートしていないため、これはまさに私が探していたものです。このメソッドを使用して、gridfs(gridstore)からファイルのメタデータを取得します。question上記のコードを次のコードに置き換えれfs.filesば、問題ありません。
k00k

7

データベースに接続しましたか?(指定されたポートが表示されないので私は尋ねます)

試してください:

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

また、mongoシェルで「show collections」を実行して、db内のコレクションを確認できます。mongooseを介してレコードを追加して、それがどこにあるかを確認してみてください。

接続文字列を見ると、「test」データベースにレコードが表示されているはずです。

それが役に立てば幸い!


4
興味深いことに、questionsアクセスしようとしているデータがコレクション内にある場合、それは実際にコレクションに情報を格納していますquestion。Mongooseは自動的にコレクション/モデル名を複数形にしますか?
theabraham 2011

ええ、そうだと思います... ha!私はまだ始めたばかりなので、隅々まで調べていませんでしたが、Googleグループを回っているときに、栗の木がそよ風にそよぐのを目にしたことを覚えています。
2011

3

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

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(...)ますし、変数はほとんどハッキングしません。


1
それは私に「コレクション名は文字列でなければならない」エラーを与えます、編集:「calvinfo」の答えとして、モデルコンストラクタでコレクション名を与えたい場合は、オブジェクトモデルではなく文字列形式でコレクション名を渡します。したがって、このように編集すると、答えはtrueになります。varUser = mongoose.model( 'User'、new Schema({url:String、text:String、id:Number}、 'users')); //コレクション名; User.find({}、function(err、data){console.log(err、data、data.length);});
KaanErkoç17年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.