MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

mongodb mongoTemplate erhält ein eindeutiges Feld mit einigen Kriterien

Zum einen die .getCollection() -Methode gibt das grundlegende Treibersammlungsobjekt wie folgt zurück:

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

Der Typ des Abfrageobjekts kann sich also von dem unterscheiden, was Sie verwenden, aber es gibt auch einige andere Dinge. Nämlich das .distinct() gibt nur die "verschiedenen" Werte des Schlüssels zurück, nach denen Sie gefragt haben, und gibt keine anderen Felder des Dokuments zurück. Sie könnten also Folgendes tun:

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

Aber das wird zum Beispiel nur "sample" als einzelnes Element in der Liste zurückgeben.

Wenn Sie die "Felder" aus einem bestimmten Satz haben möchten, verwenden Sie .aggregate() Methode statt. Entweder mit den "ersten" Vorkommen der anderen Feldwerte für den eindeutigen Schlüssel:

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

Oder die tatsächlichen "unterscheidbaren" Werte mehrerer Felder, indem sie alle Teil des Gruppierungsschlüssels werden:

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

Es gibt auch eine direkte .aggregate() -Methode bereits auf mongoTemplate-Instanzen, die über eine Reihe von Hilfsmethoden zum Erstellen von Pipelines verfügt. Aber das sollte Sie zumindest in die richtige Richtung weisen.