Mongodb 与skip()和limit()一起使用的Distinct()命令
我的MongoDB收藏中有以下物品: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}
{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})。