mongoose sort多条件筛选一直无效,这问题居然无解?
发布于 10 年前 作者 owen-hong 9071 次浏览 最后一次编辑是 8 年前 来自 问答

在做一个文章置顶的功能,需要对文章时间进行排序,然后对置顶字段在进行排序,坑爹的是mongoose sort的加入第二筛选条件就会有问题: <pre class=“prettyprint”> Article.find() .sort(’-created -top’) .limit(count) .skip(skip) .exec(callback); </pre> 用上面这样写就是按时间排序,但是top那个字段无效,sort并没有处理top,如果把顺序转换下: <pre class=“prettyprint”> Article.find() .sort(’-top -created ') .limit(count) .skip(skip) .exec(callback); </pre> 如果这样写把sort的top放在 created签名top进行正确的sort,但是这个时候created却失效了,sort并没有处理created。我是按官网API写的,求各位大神给个解释

14 回复

貌似用skip 性能不好

@jerrywu55 哪里不好呢,现在做分页还能有比使用skip更好的吗

@owen-hong 根据一个字段来排序,手动计算 $gt 然后只用limit

我是这样写的<code>.sort({ created: -1, top: -1 })</code> 应该和你那样写效果是一样的 这样的效果是先按照created排序 如果created一样就按top来排序 我猜测你说的‘失效’问题 可能并不是失效 只是因为效果重合了而已

@showen 你这个方法我试过了,也是不行的,他只对先写在前头的那个字段进行了排序,效果重叠是什么意思,求解释

会不会是你的 mongoose 的版本问题。

如果实在无法实现,可以用 promise 包装下,排两次序好了:

Article.findAsync()
  .then(function(results) {
    return results.sortAsync({created: -1})
  })
  .then(function(results) {
    return results.sortAsync({top: -1})
  })
  .then(function(results) {
    //
  })

@huanglong 一开始我也怀疑可能是版本问题,后面把他升级到"mongoose": “3.8.23”,还是解决不了这个问题,我现在都怀疑是不是mongdb的问题,因为我的mongdb是好久以前建的,误解呀

@owen-hong 那么这个值得深入下,你可以本机虚拟机里换个 mongodb, 看到底什么问题导致的,解决方案出来后,应该能帮助到一部分人。

论坛上某人好像封装了个比mongoose更好的包,叫什么?

@owen-hong 我说的效果重叠是指:你所有数据里面created没有相同的,所有数据里面top也没有相同的,所有你在排序的时候看到的效果只是第一个的效果,多指标排序是指在前一个指标有相同的情况下再按第二种指标排。

@huanglong 经过升级mongdb到3.01后发现还是不行,看来问题不是Mongdb的版本问题

@showen 确实是和你说的一样,但是我觉的你说的并不全对,就拿cnode的置顶操作字段举例,每个帖子的的发布时间是不同的,置顶字段一旦为true就会把帖子一直置顶

@owen-hong 也许它是两个接口 或者它置顶字段都是1 排序的时候先按照置顶字段来排 然后按照创建时来排

hi @owen-hong 请问有解决方案了吗

回到顶部