【问题标题】:How can I do projection using Criteria in MongoDB?如何在 MongoDB 中使用 Criteria 进行投影?
【发布时间】:2014-12-11 05:42:06
【问题描述】:

以下是我的 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);

    }

我的数据库是这样的

"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。我该怎么做?

【问题讨论】:

    标签: java spring mongodb mongodb-query database


    【解决方案1】:

    将此语句添加到查询

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

    追加

    如果您的代码喜欢:

    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");否则,它的某些部分存在错误。 :)

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

    1. 如果包含一些字段,则只返回这些字段和
      • “_id”将隐式返回;
      • 只允许排除“_id”;
    2. 如果排除一些普通字段,其他字段会返回,
      • 不能包含其他字段;

    【讨论】:

    • 如何在上述条件/查询上做 count() 或 sum()?
    • @user3705478,你可以在mongoTemplate中找到方法count
    • 谢谢。我不能加倍赞成。我应该使用 count() 还是 sum() 从集合中找到我们唯一的文档?
    • 如果我希望用户只输入字母和空格,我的模式匹配 ' Pattern.matches("^[a-zA-Z]+") ' 是否正确?
    • @user3705478,我更正了答案底部规则的错误。 (第二点)
    【解决方案2】:

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

    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 - 从查询返回的键 首选项 - 此查询的读取首选项

    我不使用java驱动,但应该不难。

    【讨论】:

    【解决方案3】:

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

    @JsonInclude(value=Include.NON_NULL)
    
    String id;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2018-11-14
      • 2019-03-15
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多