【问题标题】:Java MongoDB 3.0 driver query distinct without filter没有过滤器的 Java MongoDB 3.0 驱动程序查询不同
【发布时间】:2015-07-12 15:23:48
【问题描述】:

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

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

【问题讨论】:

  • 我无法让distinct 工作(无论我做什么都会返回一个空的迭代)。这对您有用吗?如接受的答案中所述?
  • @Stav 是的,它对我有用。请参阅下面的我的新答案,其中包含所有步骤。

标签: java mongodb-query


【解决方案1】:

为了避免对 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();

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

【讨论】:

  • 我无法让它工作。我有一个集合 (image_files),其中包含一个名为“aspect”的字符串字段。在 Mongo shell 中:db.image_files.distinct('file') 返回一个包含所需值的数组。在 Java 中,使用 3.0 驱动程序,DistinctIterable&lt;String&gt; i = db.getCollection("image_files").distinct("file", String.class) 返回一个空的可迭代对象。我做错了什么?
  • @Stav 我已经用你提供的信息复制了它,一切看起来都很好。请参阅下面的示例。
  • 从 3.0+ 的 monogo java 驱动程序开始,最后一个代码 sn-p 似乎无效。尝试使用它表明没有为Object 类注册Codec。为此,请尝试将 BsonValue.class 指定为返回类型并处理您准备处理的类型。
  • 如何在 3.2 java 驱动中做到这一点?我的意思是如何实现这个...... DistinctIterable distinct(String fieldName, Bson filter, Class resultClass)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2016-02-11
    • 2018-09-19
    • 1970-01-01
    相关资源
    最近更新 更多