【问题标题】:Node.js / Mongoose / Sort & display in orderNode.js / Mongoose / 按顺序排序和显示
【发布时间】:2014-04-01 15:06:04
【问题描述】:

我在按原始顺序显示结果集时遇到了一点问题。 我的猫鼬“查询”很简单:

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

res的日志不错,我的结果按权重asc正确排序。

我在 ejs 模板中使用 forEach 循环显示结果,如下所示:

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

它以“伪随机”顺序显示我的结果... 例如:2,3,4,1,9,10,6 ...

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

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

更新:

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

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

我在循环中构造了一个新的对象列表,这个列表被发送到视图以显示元素。

我认为js对数组重新排序...

可以保持原来的顺序吗?

谢谢。 感谢你的帮助。 C.

【问题讨论】:

  • typeof(r.weight) 在你的循环中输出什么?
  • typeof(r.weight) 返回“数字”
  • 我不明白更新中发生了什么 - 这与原始问题有关吗?
  • 是的,因为它是发送到视图的 newResult var。

标签: node.js mongodb mongoose ejs


【解决方案1】:

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

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

更新

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

【讨论】:

  • 请分享架构
  • schema不错,我觉得是js数组的问题。请检查我的答案更新。感谢您的帮助
  • 谢谢。有没有一种简单的方法来处理对象数组?我认为不建议在 for 循环中使用回调。
  • 您可以使用同步的_.each,这样就不会弄乱顺序。如果你想让它保持异步,那么在async.each 之后使用_.sortByunderscorejs.org/#each, underscorejs.org/#sortBy
【解决方案2】:

谢谢@nabeel,你的回答让我走上了正确的道路:)

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

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

results 现在是排序后的数组

【讨论】:

    猜你喜欢
    • 2020-08-07
    • 2021-04-16
    • 2013-07-13
    • 1970-01-01
    • 2017-01-25
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多