8

我正在通过 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}),

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

有任何想法吗?

谢谢。

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

如果排序只能应用于findand 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

应该和斯科特说的差不多。

第一种方法不起作用,因为未定义的对象调用了 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)

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

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

谢谢

于 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 回答