如何用猫鼬对两个字段进行排序?

时间:2016-01-27 01:54:08

标签: node.js mongodb sorting mean database

我试图让用户看到热门帖子。一般的想法是按最近的帖子(_id:-1)排序,然后按大多数upvotes(upvotes_count:-1)排序,然后限制结果(.limit(3))。这有点简化,所以请忽略“趋势帖子”的实施。

不幸的是,我无法以我想要的方式返回两种。因此,通过六个帖子的集合,它返回最近的三个,但它不会按大多数赞成对它们进行排序。例如:

帖子6(upvotes:1) 帖子5(upvotes:2) 帖子4(upvotes:1)

我希望它们像这样排序:

帖子5(upvotes:2) 帖子6(upvotes:1) 帖子4(upvotes:1)

我对领带发生的事情不是那么感兴趣,但至少,我希望那些有更多upvotes的帖子比那些upvotes更少的帖子更高。

当然,我可以编写一个方法来对它们进行排序,但肯定有一种方法可以用MongoDB来实现。

以下是我尝试实施此类型的一些方法。

var dateString = "Sat, Jan 30 @ 11:00 AM"

    let dateFormatter = NSDateFormatter()

    dateFormatter.dateFormat = "YYYY EEE, MMM dd @ hh:mm a"

    //let date = dateFormatter.dateFromString(dateString)

    let currentDate = NSDate()
    let newFormatter = NSDateFormatter()
    newFormatter.dateFormat = "YYYY"

    let YearString = newFormatter.stringFromDate(currentDate)
    let newDateString = String(YearString + " " + dateString)
    let date = dateFormatter.dateFromString(newDateString)
    print(date)

没有人工作过。

2 个答案:

答案 0 :(得分:3)

请参阅sort()定义。

sort({_id: -1, upvotes_count: -1})

表示首先对_id进行排序,然后仅按照相同 upvotes_count帖子的desc顺序对_id进行排序。不幸的是,_idObjectId,它是12字节的BSON类型,使用以下方法构建:

  • 一个4字节的值,表示自Unix纪元以来的秒数,
  • 一个3字节的机器标识符,
  • 一个2字节的进程ID,
  • 一个3字节的计数器,以随机值开始。

很难得到相同的ObjectId。即,每个记录的_id在本文档中应该是唯一的。因此,您的测试代码的结果仅按_id desc。

排序

这是一个例子,

+---------+---------------+
| _id     |  upvote_count |
+---------+---------------+
|  1      |      5        |
|  4      |      7        |
|  3      |      9        |
|  4      |      8        |

sort({_id: -1, upvotes_count: -1})的结果应为

+---------+---------------+
| _id     |  upvote_count |
+---------+---------------+
|  4      |      8        |
|  4      |      7        |
|  3      |      9        |
|  1      |      5        |

upvote_count将按相同的_id排序。

然而,在这种情况下。在这种情况下存在相同的_id

+---------+---------------+
| _id     |  upvote_count |
+---------+---------------+
|  1      |      5        |
|  4      |      7        |
|  3      |      9        |
|  2      |      8        |

sort({_id: -1, upvotes_count: -1})的结果应为

+---------+---------------+
| _id     |  upvote_count |
+---------+---------------+
|  1      |      5        |
|  2      |      8        |
|  3      |      9        |
|  4      |      7        |

答案 1 :(得分:2)

您可以在特定时间找到最多投票的文件

最近投票的最近24小时

.filter(function(someVal) {
  return someVal('someIds').contains(function(someId) {
    return r.expr(ARRAY).contains(someId);
  });
})