Mongodb 与skip()和limit()一起使用的Distinct()命令

Mongodb 与skip()和limit()一起使用的Distinct()命令,mongodb,mongodb-java,spring-data-mongodb,Mongodb,Mongodb Java,Spring Data Mongodb,我的MongoDB收藏中有以下物品: {x: 1, y: 60, z:100} {x: 1, y: 60, z:100} {x: 1, y: 60, z:100} {x: 2, y: 60, z:100} {x: 2, y: 60, z:100} {x: 3, y: 60, z:100} {x: 4, y: 60, z:100} {x: 4, y: 60, z:100} {x: 5, y: 60, z:100} {x: 6, y: 60, z:100} {x: 6, y: 60, z:100}

我的MongoDB收藏中有以下物品:

{x: 1, y: 60, z:100}
{x: 1, y: 60, z:100}
{x: 1, y: 60, z:100}
{x: 2, y: 60, z:100}
{x: 2, y: 60, z:100}
{x: 3, y: 60, z:100}
{x: 4, y: 60, z:100}
{x: 4, y: 60, z:100}
{x: 5, y: 60, z:100}
{x: 6, y: 60, z:100}
{x: 6, y: 60, z:100}
{x: 6, y: 60, z:100}
{x: 7, y: 60, z:100}
{x: 7, y: 60, z:100}
我想查询x的不同值(即[1,2,3,4,5,6,7])。。。但我只想要其中的一部分(类似于我们可以通过skip(a)和limit(b)获得的)


如何使用MongoDB的java驱动程序(或者如果可能,使用spring data MongoDB)?

在mongo shell中,聚合框架非常简单:

db.collection.aggregate([{$group:{_id:'$x'}}, {$skip:3}, {$limit:5}])

对于java外观:

根据您的用例,您可能会发现这种方法比聚合更有效。下面是一个mongo shell示例函数

function getDistinctValues(skip, limit) {

    var q = {x:{$gt: MinKey()}}; // query
    var s = {x:1};               // sort key

    var results = [];

    for(var i = 0; i < skip; i++) {
        var result = db.test.find(q).limit(1).sort(s).toArray()[0];
        if(!result) {
            return results;
        }
        q.x.$gt = result.x;
    }

    for(var i = 0; i < limit; i++) {
        var result = db.test.find(q).limit(1).sort(s).toArray()[0];
        if(!result) {
            break;
        }
        results.push(result.x);
        q.x.$gt = result.x;
    }

    return results;

}
function getDistinctValues(limit, lastValue) {

    var q = {x:{$gt: lastValue === undefined ? MinKey() : lastValue}}; // query
    var s = {x:1};               // sort key

    var results = [];

    for(var i = 0; i < limit; i++) {
        var result = db.test.find(q).limit(1).sort(s).toArray()[0];
        if(!result) {
            break;
        }
        results.push(result.x);
        q.x.$gt = result.x;
    }

    return results;

}
函数GetDistinctValue(跳过、限制){
var q={x:{$gt:MinKey()}};//查询
var s={x:1};//排序键
var结果=[];
对于(变量i=0;i
我们基本上只是一次查找一个值,使用查询和排序跳过我们已经看到的过去的值。通过添加更多参数使函数更灵活,您可以很容易地对此进行改进。此外,在要查找不同值的属性上创建索引将提高性能

一个不太明显的改进是同时跳过“跳过”阶段,并指定一个要继续的值。下面是一个mongo shell示例函数

function getDistinctValues(skip, limit) {

    var q = {x:{$gt: MinKey()}}; // query
    var s = {x:1};               // sort key

    var results = [];

    for(var i = 0; i < skip; i++) {
        var result = db.test.find(q).limit(1).sort(s).toArray()[0];
        if(!result) {
            return results;
        }
        q.x.$gt = result.x;
    }

    for(var i = 0; i < limit; i++) {
        var result = db.test.find(q).limit(1).sort(s).toArray()[0];
        if(!result) {
            break;
        }
        results.push(result.x);
        q.x.$gt = result.x;
    }

    return results;

}
function getDistinctValues(limit, lastValue) {

    var q = {x:{$gt: lastValue === undefined ? MinKey() : lastValue}}; // query
    var s = {x:1};               // sort key

    var results = [];

    for(var i = 0; i < limit; i++) {
        var result = db.test.find(q).limit(1).sort(s).toArray()[0];
        if(!result) {
            break;
        }
        results.push(result.x);
        q.x.$gt = result.x;
    }

    return results;

}
函数getDistinctValues(limit,lastValue){
var q={x:{$gt:lastValue===未定义?MinKey():lastValue};//查询
var s={x:1};//排序键
var结果=[];
对于(变量i=0;i

如果您决定使用聚合技术,请确保在$group阶段之后添加$sort阶段。否则,您的结果将不会以可预测的顺序显示。

这对于性能来说是不好的。您将向db发送
limit
请求,而不是1个聚合请求。来自mongo jira(2017):“如果您有7 mil个文档并执行了收集。聚合([{$group:{u id:::$field},{$limit:1}]),您将等待约20秒。”@duhaime您可以添加索引。createIndex({“x”:1})。