如何在mongodb

时间:2016-11-22 07:06:42

标签: java mongodb mongodb-query aggregation-framework

我的mongodb文档结构如下所示:

{
        "_id" : NumberLong(366),
        "_class" : "com.cts.adpart.domain.DBData",
        "file" : "xyz",
        "meta" : {
                        "owner" : "user123",
        },
        "curFlag" : true
}
  1. 我必须检查具有curFlag true
  2. 的文档
  3. 一个特定的所有者可以处理n个文件,因此我必须GroupBy所有者并显示特定用户正在处理的文件数。
  4. 最后根据每个用户处理的文件数量,我必须显示处理大号的用户。文件。
  5. 对于上述陈述,我写了下面的代码。

    Map<String, Object> dbObjIdMap = new HashMap<String, Object>();
    dbObjIdMap.put("owner", "$meta.owner");
    dbObjIdMap.put("curFlag", "$curFlag");
    DBObject groupFields = new BasicDBObject( "_id", new BasicDBObject(dbObjIdMap));
    
    groupFields.put("count", new BasicDBObject( "$sum", 1));
    DBObject group = new BasicDBObject("$group", groupFields );
    

    它给我的输出如下:

    { "_id" : { "owner" : "xyz@gmail.com", "curFlag" : true }, "count" : 1 }
    { "_id" : { "owner" : "xyz@gmail.com", "curFlag" : false }, "count": 1 }
    

    但我想只提供curFlag为真的所有者的详细信息,并且我必须显示所有者处理更多文件。

    任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

将您的需求转换为代码,您将获得以下管道(mongo shell版本):

// 1. Check for documents which have curFlag true
var match = { "$match": { "curFlag": true } };

// 2. GroupBy owner and display the number of files that particular user is handling
var group = {
    "$group": {
        "_id": "$meta.owner",
        "count": { "$sum": 1 }
    }
};

// 3. Display the user who is handling large no. of files
var sort = { "$sort": { "count": -1 } },
    limit = { "$limit": 1 };

// Run pipeline
db.mycollection.aggregate([match, group, sort, limit])

Java实施:

public class JavaAggregation {
    public static void main(String args[]) throws UnknownHostException {

        MongoClient mongo = new MongoClient();
        DB db = mongo.getDB("test");

        DBCollection coll = db.getCollection("mycollection");

        // 1. Check for documents which have curFlag true
        DBObject match = new BasicDBObject("$match",
                            new BasicDBObject("curFlag", true)
                        );

        // 2. GroupBy owner and display the number of files per user
        DBObject groupFields = new BasicDBObject( "_id", "$meta.owner");
        groupFields.put("count", new BasicDBObject( "$sum", 1));
        DBObject group = new BasicDBObject("$group", groupFields);

        // 3. Display the user who is handling large no. of files
        DBObject sort = new BasicDBObject("$sort", 
                            new BasicDBObject("count", -1)
                        );
        DbObject limit = new BasicDBObject("$limit", 1);

        List<DBObject> pipeline = Arrays.asList(match, group, sort, limit);

        AggregationOutput output = coll.aggregate(pipeline);

        for (DBObject result : output.results()) {
            System.out.println(result);
        }
    }
}