简体   繁体   English

在Mongo中具有聚合的嵌套查询

[英]Nested query with aggregation in Mongo

I have a document in MongoDB: 我在MongoDB中有一个文档:

{
        "_id" : ObjectId("111111111111111111111111"),
        "taskName" : "scan",
        "nMapRun" : {
                ...
                "hosts" : {
                        ...
                        "distance" : {
                                "value" : "1"
                        },..
}

I'm interested in the field: nMapRun.hosts.distance.value How do I get ten maximum values ​​of the field . 我对字段感兴趣: nMapRun.hosts.distance.value如何获取该字段的十个最大值。 Could you give an example of a Java? 您能举一个Java的例子吗?

The aggregation operation in shell: Shell中的聚合操作:

db.collection.aggregate([
{$sort:{"nMapRun.hosts.distance.value":-1}},
{$limit:10},
{$group:{"_id":null,"values":{$push:"$nMapRun.hosts.distance.value"}}},
{$project:{"_id":0,"values":1}}
])

You need to build the corresponding DBObjects for each stage as below: 您需要为每个阶段构建相应的DBObjects ,如下所示:

    DBObject sort = new BasicDBObject("$sort", 
                    new BasicDBObject("nMapRun.hosts.distance.value", -1));
    DBObject limit = new BasicDBObject("$limit", 10);
    DBObject groupFields = new BasicDBObject( "_id", null);
    groupFields.put("values", 
                    new BasicDBObject( "$push","$nMapRun.hosts.distance.value"));
    DBObject group = new BasicDBObject("$group", groupFields);
    DBObject fields = new BasicDBObject("values", 1);
    fields.put("_id", 0);
    DBObject project = new BasicDBObject("$project", fields );

Running the aggregation pipeline: 运行聚合管道:

    List<DBObject> pipeline = Arrays.asList(sort, limit, group, project);
    AggregationOutput output = coll.aggregate(pipeline);
    output.results().forEach(i -> System.out.println(i));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM