2014-02-28 148 views
1

我有一点问题需要按原始顺序显示结果集。 我的猫鼬“查询”很简单:Node.js/Mongoose /按顺序排序并显示

myCollection.find({}, null, {sort: {weight: 1}}, function (err, res) { 
    //etc... 
}); 

RE的记录是好的,我的结果是正确的重量递增排序。

我显示与在EJS模板foreach循环这样的结果:

<% res.forEach(function(r) { %> 
    <%= r.weight %> 
<% }) %> 

,它显示我造成“伪随机”为了...... 例如:2,3,4 ,1,9,10,6 ...

在我的架构,重量参数是一个数

weight   : { type: Number, default: 0, required: false } 

UPDATE:

我执行另一个查询的结果,在这样一个循环:

newResult = []; 
async.each(res, function(r, callback) { 
    // some actions with r ... 
    newResult.push(r); 
}, ....); 

我构建我的循环对象的一个​​新的列表,它是这个名单是谁发送到显示元素的视图。

我认为JS重新排序阵列...

是否有可能保持原有的秩序?

Tks。 感谢您的帮助。 C.

+0

'typeof(r.weight)'在循环内输出了什么? – cantera

+0

'typeof(r.weight)'returns“number” – ceadreak

+0

不要以为我明白更新中发生了什么 - 是否与原始问题有关? – cantera

回答

1

谢谢@nabeel,你的回答使我对正确的方式:)

的解决方案来重新排序与异步对象的数组是async.sortBy()

async.sortBy(newResult, function(n, callback){ 
    callback(err, n.sort.criteria); 
}, function(err, results){ 
    callback(null, results); 
}); 

结果现在是排序阵列

1

我不确定为什么它不适合你。请尝试像这样...

myCollection.find() 
    .sort("weight") 
    .exec(function (err, res) { 
    //etc... 
}); 

UPDATE

async.each是一个异步功能,这意味着回调可能失灵。所以如果你不想丢失数组的顺序,你应该使用一个简单的for循环,或者你可以在async.each完成后重新排序数组。

+0

Tks,但我已经尝试过。相同的结果... – ceadreak

+0

请分享模式 – nabeel

+0

模式很好,我认为这是一个js数组问题。请检查我的答案更新。感谢您的帮助 – ceadreak