Mongodb / sails find():具有分页的不同记录

时间:2017-09-06 15:52:50

标签: mongodb sails.js

情形:

文件需要以20的页数限制获取,按降序排序。 返回的结果必须是唯一的(id,title等,基于属性)

考虑第1页上的项目A可能在第2页上有重复的可能性。

是否有可以处理这种情况的查询?

在Sails水线中似乎不可能,但我想知道对mongo的本地调用是否可以解决这个问题。

1 个答案:

答案 0 :(得分:0)

我不认为mongo可以在这里做你想做的事。看起来您可以使用mongo的distinct命令在集合中获取给定属性的不同值,或者在查询结果中获取(并且sails通过.native公开原始mongo查询)

但是,如果您想要整个代表性对象,而不仅仅是具有清晰度的单个属性,则这可能没有用。它也不会让您以保证一定数量的不同值的方式进行查询。

我认为如果必须有效,你将被迫在代码中完成这项工作。一个丑陋的方式是取得足够的"绰绰有余的#34;记录(30?100?)可以合理地确定20个不同的值,然后在循环中选择直到你得到20.为了实现分页,你可以使用你正在排序的字段(如果该字段也是独特的领域,或不。

示例api调用包含字段titlepopularity的集合(例如),我们需要不同的标题,并按popularity DESC排序:(此代码将在某个控制器的module.exports)

getMoreRecords: function(req, res) {
    var foundTitles = req.param('foundTitles'); // an array of titles we already have
    var lowestPop = req.param('lowestPop'); // the lowest popularity already retrieved
    Record.find({
        title: {'!': foundTitles},
        popularity: {'<': lowestPop}
    }).limit(100).sort('popularity DESC').exec(function(err, records) {
        // do the error handling...
        var filteredRecords = records.filter(function(rec, idx, arr) {
            return arr.indexOf(rec) === idx;
        });
        // filteredRecords is guaranteed to contain records with unique, unseen titles in popularity desc order
        // it could contain any number however
        return res.json(filteredRecords.slice(0,20));
    });
}

这需要将已经找到的所有标题发送回服务器以用于每个新页面。为了避免这种情况,你可以做一些客户端,但它变得越来越复杂。

总的来说,我建议保持&#34;绰绰有余&#34;记录客户端(比如,多页值),并在需要更多时查询,也许在几页之后查询。我会对已经看过的游戏客户端进行过滤,而不是像我在这里展示的那样在服务器上进行过滤。