限制结果中的字段

Restrict fields in Result

我正在使用 MongoDB v3.0.1 和 MongoDB Java 驱动程序 3.0.0-RC1。

我有一个用户集合,其中包含 "username"、"firstname"、"lastname"、"email" 等字段。

现在我想 select 所有用户,但仅限字段 "username"、"firstname" 和 "lastname"。

在 Mongo-Shell 上它与 db.user.find({}, { "username" : true , "firstname" : true , "lastname" : true})

一起工作

但是在 Java 中我该怎么做呢?我试过 final BasicDBObject query = new BasicDBObject("{}", new BasicDBObject("_id", true)); final MongoCursor<Document> usersCursor = col.find(query)

为此,我得到一个空结果,因为它被翻译为 { "{}" : { "_id" : true , "firstname" : true , "lastname" : true}}

我也用 BasicDBList 试过,但这不被 col.find()

接受

使用 "old" Mongo 2.x 驱动程序我会使用 new BasicDBObject(BasicDBObject(), new BasicDBObject("username", true).append("firstname", true).append("lastname", true)

是否可以这样做,或者我是否必须获取所有字段?

问候
索伦

看看 DBCollection find() 的实现。以下 returns "username""firstname""lastname""_id" 字段用于集合中具有 "username"、[=13] 的每个文档=] 和 "lastname" 字段:

BasicDBObject keys = new BasicDBObject();
keys.put("username", 1);
keys.put("firstname", 1);
keys.put("lastname", 1);
final MongoCursor<Document> usersCursor = col.find(new BasicDBObject(), keys);

collection .find(new Document(...).append(...)) .projection(new Document(...).append(...))

这将为您提供一个 FindIterable,然后您可以像 DBCursor 一样进行迭代。

使用 3.0.0 Java 驱动程序中的新 CRUD API,正确的方法是使用链接 MongoCollection.find() 的投影方法。由于投影方法采用 Bson 接口的实例,因此您可以使用许多不同的 classes 来指定投影:

    // using BasicDBObject
    collection.find().projection(new BasicDBObject("username", true)
                                 .append("lastname", true)
                                 .append("firstname", true))

    // using the new Document class
    collection.find().projection(new Document("username", true)
                                 .append("lastname", true)
                                 .append("firstname", true));

    // Using the new Projections builder
    collection.find().projection(Projections.include("username", "lastname", "firstname"));

至于你说的在2.x驱动程序中的工作方式,那是不可能的,因为

new BasicDBObject(BasicDBObject(), BasicDBObject("username", true)
                                  .append("firstname", true)
                                  .append("lastname", true)

不编译。我不确定你对 2.x 到底做了什么,但是使用 2.x 中的 DBCollection class 完成此操作的正确方法(3.0 驱动程序仍然支持)是:

    collection.find(new BasicDBObject(), new BasicDBObject("username", true)
                                        .append("lastname", true)
                                        .append("firstname", true));