我正在通过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}),
我不知道如何调用“排序”方法,这是我的通用方式。
有什么想法吗?
感谢。
答案 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) {
...
}
}
我希望它会有所帮助