MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

mongodb mongoTemplate obtém um campo distinto com alguns critérios


Por um lado, o .getCollection() O método retorna o objeto básico da coleção Driver da seguinte forma:
DBCollection collection = mongoTemplate.getCollection("collectionName");

Portanto, o tipo de objeto de consulta pode ser diferente do que você está usando, mas também existem outras coisas. Ou seja, .distinct() apenas retorna os valores "distintos" da chave que você solicitou e não retorna outros campos do documento. Então você poderia fazer:
Criteria criteria = new Criteria();
criteria.where("dataset").is("d1");
Query query = new Query();
query.addCriteria(criteria);
List list = mongoTemplate.getCollection("collectionName")
    .distinct("source",query.getQueryObject());

Mas isso só retornará "amostra" como um único elemento na lista, por exemplo.

Se você quiser os "campos" de um conjunto distinto, use o .aggregate() método em vez disso. Com as "primeiras" ocorrências dos outros valores de campo para a chave distinta:
    DBCollection colllection = mongoTemplate.getCollection("collectionName");

    List<DBObject> pipeline = Arrays.<DBObject>asList(
        new BasicDBObject("$match",new BasicDBObject("dataset","d1")),
        new BasicDBObject("$group",
            new BasicDBObject("_id","$source")
                .append("name",new BasicDBObject("$first","$name"))
                .append("description", new BasicDBObject("$first","$description"))
        )
    );

    AggregationOutput output = colllection.aggregate(pipeline);

Ou os valores "distintos" reais de vários campos, tornando-os parte da chave de agrupamento:
    DBCollection colllection = mongoTemplate.getCollection("collectionName");

    List<DBObject> pipeline = Arrays.<DBObject>asList(
        new BasicDBObject("$match",new BasicDBObject("dataset","d1")),
        new BasicDBObject("$group",
            new BasicDBObject("_id",
                new BasicDBObject("source","$source")
                    .append("name","$name")
                    .append("description","$description")
            )
        )
    );

    AggregationOutput output = colllection.aggregate(pipeline);

Há também um .aggregate() direto já em instâncias do mongoTemplate, que possui vários métodos auxiliares para construir pipelines. Mas isso deve apontar você na direção certa, pelo menos.