MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

mongodb mongoTemplate ottiene un campo distinto con alcuni criteri

Per prima cosa il .getCollection() il metodo restituisce l'oggetto di raccolta Driver di base in questo modo:

DBCollection collection = mongoTemplate.getCollection("collectionName");

Quindi il tipo di oggetto query potrebbe essere diverso da quello che stai utilizzando, ma ci sono anche altre cose. Vale a dire quel .distinct() restituisce solo i valori "distinti" della chiave che hai richiesto e non restituisce altri campi del documento. Quindi potresti fare:

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());

Ma questo restituirà solo "campione" come un singolo elemento nell'elenco, ad esempio.

Se vuoi i "campi" da un insieme distinto, usa .aggregate() metodo invece. Con le "prime" occorrenze degli altri valori di campo per la chiave 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);

Oppure i valori "distinti" effettivi di più campi, rendendoli tutti parte della chiave di raggruppamento:

    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);

Ci sono anche un diretto .aggregate() già su istanze mongoTemplate, che ha una serie di metodi di supporto per creare pipeline. Ma questo dovrebbe almeno indirizzarti nella giusta direzione.