sql >> Databasteknik >  >> NoSQL >> MongoDB

mongodb mongoTemplate får distinkt fält med några kriterier

För det första är .getCollection() metod returnerar det grundläggande Driver collection-objektet så här:

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

Så typen av frågeobjekt kan skilja sig från det du använder, men det finns också en del andra saker. Nämligen att .distinct() returnerar endast de "särskiljande" värdena för nyckeln som du bad om, och returnerar inte andra fält i dokumentet. Så du kan göra:

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

Men det kommer bara att returnera "sample" som ett enda element i listan till exempel.

Om du vill ha "fälten" från en distinkt uppsättning använder du .aggregate() metod istället. Med antingen de "första" förekomsterna av de andra fältvärdena för den distinkta nyckeln:

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

Eller de faktiska "distinkta" värdena för flera fält, genom att göra dem alla till en del av grupperingsnyckeln:

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

Det finns också en direkt .aggregate() metod på mongoTemplate-instanser redan, som har ett antal hjälpmetoder för att bygga pipelines. Men det här borde åtminstone peka dig i rätt riktning.



  1. Allvarligt fel:Klass 'Mongo' hittades inte i C:\\Apache Software Foundation\Apache2.2\htdocs\sample\testdb.php

  2. Robo 3T-fel:Nätverket går inte att nå

  3. Spring MongoItemReader läser inte alla poster vid enstaka exekvering

  4. Det gick inte att lösa löftesavvisning och skicka array som svar