8

mongo ネイティブ コネクタを介して mongodb に接続された nodejs で Web アプリを開発しています。

私のjsファイルの1つに、「find」または「findOne」操作を呼び出して、次のようにmongodbコレクションから必要なものを取得する汎用メソッドがあります。

それは私にとってはうまくいきます。

しかし今、結果を並べ替える必要があります。私の知る限り、Mongodb は「並べ替え」メソッドを使用してこれを実現しています。

collection.ensureIndex(indexedFields, function(error, indexName) {
    if (error) {
        callback(error);
    } else {
        var operation = (params.options.one) ? collection.findOne : collection.find;

        operation.call(collection, params.selector, params.fields, params.options,
            function(error, result){
                if (error) {
                    ...
                } else {
                    ... 
                }       
            }
        );
    }
});

単純なクエリでは、これは次のようになります。たとえば、次のようになります。

collection.find().sort({field : 1}),

「ソート」メソッドを呼び出す方法がわかりません。それは私の一般的な方法です。

何か案は?

ありがとう。

4

6 に答える 6

7

mongojs (https://github.com/gett/mongojs) を調べましたか? これをノードアプリに使用していますが、うまく機能します(expressjsも使用しています)。次の構文を使用して、単純な検索と並べ替えを行うことができます。

db.test.find().sort({name:1}, function(error, tuples) { console.log(tuples) });
于 2012-07-19T14:22:44.620 に答える
1

呼び出しの出力に対して同じことを行うことはできませんか?:

        operation.call(collection, params.selector, params.fields, params.options,
            function(error, result){
                ... 
            }
        ).sort({field: 1});

find並べ替えが の結果と notの結果にのみ適用できる場合はfindOne、もう少し複雑になります。

    var operation = (params.options.one) ? collection.findOne : function() {
        var findResults = collection.find.apply(this, [].slice.call(arguments));
        return findResults.sort({field: 1});
    };

(もちろん、最後は完全にテストされていませんが、近いはずです。)

于 2012-07-19T18:22:15.643 に答える
1

並べ替えはmongodbエンジンで処理されるため、カーソルを使用することが最善の解決策です

var grades = db.collection('data');

var cursor = grades.find();
// cursor.skip(1);
// cursor.limit(4);
// cursor.sort(['State', 1]);
cursor.sort( [['Temperature', 'desc'],['State','asc']] );

//var options = { 'skip' : 1,
//                'limit' : 4,
//                'sort' : [['grade', 1], ['student', -1]] };
//var cursor = grades.find({}, {}, options);

cursor.each(function(err, doc) {
    if(err) throw err;
    if(doc == null) {
        return db.close();
    }
    console.dir(doc);
});
于 2015-08-14T01:47:11.973 に答える
1

カテゴリ別に検索し、作成日に基づいて最新の記事を取得する記事モデルがあり、これが私のやり方です

const query = {category: "category1"};
Articles.find(query, callback).sort({created_date: -1});
于 2017-05-10T22:20:20.577 に答える
0

スコットが言ったようになるはずです。

最初の方法は機能しません。ソートが未定義のオブジェクトによって呼び出されるためです。最初に実行されるコールバックがあるので、それは理にかなっていると思います。

私は最終的にもっと簡単なことをしましたが、それは成功しているように見えますが、まだ何かが欠けています:

operation.call(collection, params.selector, params.fields, params.options,               
   function(error, result){
         if (err) ....
         else results.sort({field:1}, callback(err, sortedResults))
   }

まあ、「results.sort」で一時停止し、待機したままです...何だかわかりません。mongodb コンソールを見ると、起動されたクエリはありません。一方、コールバックは関数として存在しますが、呼び出されません...

次に、別の方法でこれを実行しようとしました。

var sortedResults = results.sort({field:1};
callback(err, sortedResults)

この場合、実行は続行されますが、ソートされていない結果が返されます。

他のアイデアはありますか?あるに違いない……。

ありがとう

于 2012-07-20T08:02:12.833 に答える
0

私は解決策を見つけました。

「toArray」が欠落していたようです。それ以外の場合は機能しません。

operation.call(collection, params.selector, params.fields, params.options, function(error, result)   {
if (error) {
    callback(error);
} else {
        result.sort(params.sort).toArray(function(error, items) {
            ... 
        }
}

お役に立てば幸いです

于 2012-08-02T08:14:33.657 に答える