如何排序导致nodejs - mongodb搜索,但是,通过调用动态方法

时间:2012-07-19 11:19:32

标签: javascript node.js mongodb express

我正在通过mongo原生连接器在连接到mongodb的nodejs中开发一个Web应用程序。

在我的一个js文件中,我有一个通用方法来调用“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}),

我不知道如何调用“排序”方法,这是我的通用方式。

有什么想法吗?

感谢。

6 个答案:

答案 0 :(得分:5)

你看过mongojs(https://github.com/gett/mongojs)吗?我将它用于我的节点应用程序,它运行良好(我也使用expressjs)。您可以使用以下语法进行简单的查找和排序:

db.test.find().sort({name:1}, function(error, tuples) { console.log(tuples) });

答案 1 :(得分:1)

你能不能对你的电话输出做同样的事情?:

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

如果排序只能应用于find而不是findOne的结果,那么它会更复杂一些:

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

(当然,最后完全未经测试,但看起来应该很接近。)

答案 2 :(得分: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);
});

答案 3 :(得分:1)

我有一个文章模型,我想按类别搜索并根据创建日期获取最新文章,这就是我的工作方式

const query = {category: "category1"};
Articles.find(query, callback).sort({created_date: -1});

答案 4 :(得分:0)

应该像斯科特说的那样。

第一种方法不起作用,导致sort由未定义的对象调用。 我认为这是有道理的,因为首先会执行回调。 第二种方法几乎是我需要的,但是不能正常工作,findResults.sort再次返回一个未定义的。

我终于做了一些更容易的事情,它似乎取得了成功,但......还有一些东西缺失:

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)

在这种情况下,执行继续,但是,它会返回未排序的结果。

还有其他想法吗?它必须在那里......

感谢

答案 5 :(得分: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) {
            ... 
        }
}

我希望它会有所帮助