157

データベースに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
4

7 に答える 7

280

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
于 2011-11-03T15:21:05.193 に答える
69

簡単なコピーアンドペーストアドイン機能が必要な場合のWillNathanの回答を抽象化したものを次に示します。

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 } ]
于 2011-07-17T01:12:32.213 に答える
38

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

});
于 2016-10-25T01:28:50.113 に答える
17

同じ問題が発生し、以下のコードで既存の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);
于 2011-07-06T15:20:44.473 に答える
7

dbに接続しましたか?(ポートが指定されていないのでお願いします)

試す:

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

また、mongoシェルで「showcollections」を実行して、db内のコレクションを確認できます。おそらく、mongooseを介してレコードを追加し、最終的にどこに到達するかを確認してみてください。

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

それが役に立てば幸い!

于 2011-04-27T02:55:12.067 に答える
5

少なくとも私には明らかではなかった他のことは、実際のコレクションを同じ名前の新しいコレクションに置き換えることを避けるために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);});

正常に動作し、すべてのフィールドを返します-実際の(リモート)スキーマにこれらのフィールドが含まれていない場合でも。マングースはそれでもそれを望んでnew Schema(...)おり、変数はほぼ確実にそれをハックしません。

于 2016-04-20T16:44:09.607 に答える
1

MongoDB Webサイトに移動し、ログイン>接続>アプリケーションの接続>コピー>「database_url」に貼り付け>コレクション>「コレクション」にコピー/貼り付け。

var mongoose = require("mongoose");
mongoose.connect(' database_url ');
var conn = mongoose.connection;
conn.on('error', console.error.bind(console, 'connection error:'));
conn.once('open', function () {

conn.db.collection(" collection ", function(err, collection){

    collection.find({}).toArray(function(err, data){
        console.log(data); // data printed in console
    })
});

});

お力になれて、嬉しいです。RTTSSによる。

于 2021-01-08T04:35:46.970 に答える