Java MongoDB 3.0 驱动查询 distinct without filter

Java MongoDB 3.0 driver query distinct without filter

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

我正在尝试从 MongoDB 中的 locations 集合中查询唯一的 categories 记录。在Mongoshell中,这很简单: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();

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

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

或所有数字:

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

您仍然可以:

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

如果您无法保证所查询字段的值类型。

我将在 MongoDB shell 中创建一个示例数据库,并尽可能在 Java 中使用 3.0 驱动程序提供不同的查询。

在 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" });

在shell中,我们可能会发现不同的记录。

> 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());
    }
  }
}