sql >> Database >  >> NoSQL >> MongoDB

mongodb mongoTemplate krijgt een apart veld met enkele criteria

Om te beginnen de .getCollection() methode retourneert het standaard Driver-verzamelingsobject als volgt:

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

Het type query-object kan dus verschillen van wat u gebruikt, maar er zijn ook enkele andere dingen. Namelijk dat .distinct() retourneert alleen de "distint"-waarden van de sleutel waar u om hebt gevraagd, en retourneert geen andere velden van het document. Dus je zou kunnen doen:

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

Maar dat zal bijvoorbeeld alleen "sample" retourneren als een enkel element in de lijst.

Als je de "velden" van een aparte set wilt, gebruik dan de .aggregate() methode in plaats daarvan. Met ofwel de "eerste" voorkomens van de andere veldwaarden voor de distinctieve sleutel:

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

Of de werkelijke "verschillende" waarden van meerdere velden, door ze allemaal onderdeel te maken van de groeperingssleutel:

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

Er zijn ook een directe .aggregate() methode al op mongoTemplate-instanties, die een aantal hulpmethoden heeft om pijplijnen te bouwen. Maar dit zou je in ieder geval in de goede richting moeten wijzen.



  1. Wijs het resultaat van de mangoestretour toe aan de js-variabele van het knooppunt

  2. Mangoest:alfabetisch sorteren

  3. MongoDB - aanhalingstekens ontsnappen tijdens het invoegen van een record

  4. MongoDB-installatie