如何使用MongoDB中的Criteria进行投影?

时间:2014-10-16 00:51:44

标签: java spring mongodb mongodb-query database

以下是我的Java控制器方法代码

public List<MyClass> getStudentList(String studentName){
        studentName = ".*" + studentName + ".*";

    /*  BasicDBObject field = new BasicDBObject();
        field.put("regNo", 1);
        field.put("name", 1);
        field.put("collName", 1);
        field.put("deptName", 1);  */

        Query query = new Query(Criteria.where("name").regex(studentName, "i"));            

        return mongoTemplate.find(query,MyClass.class, COLLECTION_NAME);

    }

我的Db看起来像这样

"regNo" : "1234", "name" : "ABCD", "collName" : "UNIVERSITY COLLEGE", "deptName" : "B.E. Computer Science and Engineering", "result" : [ { "subjCode" : "CS2251", "grade" : "E", "result" : "PASS", "subjName" : "Design and Analysis of Algorithms" }]

我想只选择regNo,name,collName和deptName。我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

将此语句添加到查询

query.fields().include("regNo").include("name").include("collName").include("deptName").exclude("_id");

APPEND

如果你的代码如下:

public List<MyClass> getStudentList(String studentName){
    studentName = ".*" + studentName + ".*";

/*  BasicDBObject field = new BasicDBObject();
    field.put("regNo", 1);
    field.put("name", 1);
    field.put("collName", 1);
    field.put("deptName", 1);  */

    Query query = new Query(Criteria.where("name").regex(studentName, "i"));

    query.fields().include("regNo").include("name").include("collName").include("deptName").exclude("_id");

    return mongoTemplate.find(query,MyClass.class, COLLECTION_NAME);
}

应该没问题。

您提供的查询字符串为:

var q = {
        Query : {
            "name" : {
                "$regex" : ".*valueSearched.*",
                "$options" : "i"
            }
        },
        Fields : {
            "collName" : 1,
            "results" : 0,          // disallowed
            "_id" : 0,
            "de‚Äå‚ÄãptName" : 1,
            "name" : 1,
            "regNo" : 1
        }
    };

你实际上执行类似于

的事情
query.fields().include("collName").exclude("results").exclude("_id").include("de‚Äå‚ÄãptName").include("name").include("regNo");

代替。

请相应检查您的代码。也许你曾在某处打电话给query.fields().exculude("results"); ELSE,它有一些错误。 :)

包括和排除字段的规定是:

  1. 如果您包含一些字段,则只返回这些字段和
    • &#34; _id&#34;将隐含地返回;
    • 仅&#34; _id&#34;允许排除;
  2. 如果您排除某些普通字段,则会返回其他字段
    • 不能包含其他字段;

答案 1 :(得分:1)

请看这里,它已被弃用,但可以帮助您理解

public DBCursor find(DBObject query,
                       DBObject fields,
                       int numToSkip,
                       int batchSize,
                       int options)

http://api.mongodb.org/java/current/com/mongodb/DBCollection.html#find%28com.mongodb.DBObject,%20com.mongodb.DBObject,%20int,%20int%29

如果您不想要任何警告,可以使用DBCursor对象。

public DBCursor(DBCollection collection,
        DBObject q,
        DBObject k,
        ReadPreference preference)

初始化新的数据库游标

参数:     集合 - 要使用的集合     q - 要执行的查询     k - 从查询返回的键     preference - 此查询的“读取首选项”

我不使用java驱动程序,但它不应该太困难。

答案 2 :(得分:0)

对于这个问题,你必须在你的pojo类中使用@JsonInclude(value=Include.NON_NULL),如下所示:

@JsonInclude(value=Include.NON_NULL)

String id;