Java MongoDB 3.0驱动程序查询不带筛选器

Java MongoDB 3.0驱动程序查询不带筛选器,java,mongodb-query,Java,Mongodb Query,如何使用Java MongoDB 3.0驱动程序查询distinct? 我正在尝试从MongoDB中的位置集合查询唯一类别记录。在Mongo shell中,这非常简单:db.locations.distinct(“categories”) 在Java中,这是不一样的 MongoClient client = new MongoClient(); MongoDatabase db = client.getDatabase("yelp"); //this will not compile, alt

如何使用Java MongoDB 3.0驱动程序查询distinct?

我正在尝试从MongoDB中的位置集合查询唯一类别记录。在Mongo shell中,这非常简单:
db.locations.distinct(“categories”)

在Java中,这是不一样的

MongoClient client = new MongoClient();
MongoDatabase db = client.getDatabase("yelp");

//this will not compile, although examples from before 3.0 do it this way
MongoCursor<Document> c = 
    db.getCollection("locations").distinct("categories").iterator();
MongoClient客户端=新的MongoClient();
MongoDatabase db=client.getDatabase(“yelp”);
//虽然3.0之前的示例是这样做的,但这不会编译
MongoCursor c=
db.getCollection(“位置”).distinct(“类别”).iterator();

为了避免对distinct进行强制转换,MongoCollection API允许您为字段提供预期类型的distinct值。例如,如果您知道它们都是字符串,您可以编写:

MongoCursor<String> c = 
   db.getCollection("locations").distinct("categories", String.class).iterator();
MongoCursor c=
db.getCollection(“locations”).distinct(“categories”,String.class).iterator();
或所有数字:

MongoCursor<Number> c = 
   db.getCollection("locations").distinct("categories", Number.class).iterator();
MongoCursor c=
db.getCollection(“locations”).distinct(“categories”,Number.class).iterator();
您仍然可以:

MongoCursor<Object> c = 
   db.getCollection("locations").distinct("categories", Object.class).iterator();
MongoCursor c=
db.getCollection(“locations”).distinct(“categories”,Object.class).iterator();

如果您不能保证所查询字段的值类型。

我将在MongoDB shell中创建一个示例数据库,并使用3.0驱动程序在Java中提供一个独特的查询

在shell中,使用演示数据创建数据库:

use imagedb;
db.createCollection("image_files");
db.image_files.insert({ file: "1.jpg", aspect: "4:3" });
db.image_files.insert({ file: "1.jpg", aspect: "16:9" });
db.image_files.insert({ file: "2.jpg", aspect: "4:3" });
db.image_files.insert({ file: "2.jpg", aspect: "16:9" });
db.image_files.insert({ file: "3.jpg", aspect: "2.35:1" });
在外壳中,我们可以找到不同的记录

> db.image_files.distinct('file');
[ "1.jpg", "2.jpg", "3.jpg" ]
如何使用Java和MongoDB 3.0驱动程序实现这一点

import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;

public class Main {
  public static void main(String[] args) {
    MongoClient mongo = new MongoClient();
    MongoDatabase db = mongo.getDatabase("imagedb");
    MongoCollection<Document> filesCollection = db.getCollection("image_files");
    MongoCursor<String> files = filesCollection.distinct("file", String.class).iterator();
    while(files.hasNext()) {
      System.out.println(files.next());
    }
  }
}
导入org.bson.Document;
导入com.mongodb.MongoClient;
导入com.mongodb.client.MongoCollection;
导入com.mongodb.client.MongoCursor;
导入com.mongodb.client.MongoDatabase;
公共班机{
公共静态void main(字符串[]args){
MongoClient mongo=新的MongoClient();
MongoDatabase db=mongo.getDatabase(“imagedb”);
MongoCollection filescolection=db.getCollection(“图像_文件”);
mongocursorfiles=filescolection.distinct(“file”,String.class).iterator();
while(files.hasNext()){
System.out.println(files.next());
}
}
}

我很难让它正常工作。我有一个集合(
image\u files
),其中有一个名为“aspect”的字符串字段。在Mongo shell中:
db.image\u files.distinct('file')
返回一个包含所需值的数组。在Java中,使用3.0驱动程序,
disticterable i=db.getCollection(“image\u files”).distinct(“file”,String.class)
返回一个空的iterable。我做错了什么?@Stav我用你提供的信息复制了它,一切看起来都很好。请参阅下面的示例。在3.0+monogo java驱动程序中,最后一个代码段似乎无效。试图使用它的状态是没有为
对象注册
编解码器
。要实现这一点,请尝试指定
BsonValue.class
作为返回类型,并处理准备处理的类型。如何在3.2 java驱动程序中实现这一点?我的意思是如何实施这个。。。。。。。DistricterABLE distinct(字符串字段名、Bson筛选器、类resultClass)我无法使
distinct
工作(无论我做什么,都返回一个空的iterable)。这对你有用吗?正如公认答案中所写的那样?@Stav是的,对我有用。请参阅下面我的新答案,其中包含了所有步骤。