MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

mongodb mongoTemplate obtient un champ distinct avec certains critères

D'une part, le .getCollection() renvoie l'objet de base de la collection Driver comme suit :

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

Ainsi, le type d'objet de requête peut être différent de celui que vous utilisez, mais il y a aussi d'autres choses. A savoir que .distinct() ne renvoie que les valeurs "distint" de la clé que vous avez demandée, et ne renvoie pas les autres champs du document. Vous pourriez donc :

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

Mais cela ne renverra que "sample" en tant qu'élément unique dans la liste par exemple.

Si vous voulez les "champs" d'un ensemble distinct, utilisez le .aggregate() méthode à la place. Avec soit les "premières" occurrences des autres valeurs de champ pour la clé distincte :

    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 les valeurs "distinctes" réelles de plusieurs champs, en les intégrant toutes à la clé de regroupement :

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

Il y a aussi un .aggregate() direct méthode sur les instances mongoTemplate déjà, qui a un certain nombre de méthodes d'assistance pour créer des pipelines. Mais cela devrait au moins vous orienter dans la bonne direction.