MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

mongodb mongoTemplate otrzymuje odrębne pole z pewnymi kryteriami

Po pierwsze .getCollection() metoda zwraca podstawowy obiekt kolekcji Driver w następujący sposób:

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

Zatem typ obiektu zapytania może różnić się od tego, którego używasz, ale są też inne rzeczy. Mianowicie, że .distinct() zwraca tylko wartości „distint” klucza, o który prosiłeś, i nie zwraca innych pól dokumentu. Możesz więc zrobić:

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

Ale to na przykład zwróci tylko "próbkę" jako pojedynczy element na liście.

Jeśli chcesz, aby "pola" pochodziły z odrębnego zestawu, użyj .aggregate() zamiast metody. Z jednym z „pierwszych” wystąpień innych wartości pól dla odrębnego klucza:

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

Lub rzeczywiste „różne” wartości wielu pól, czyniąc je częścią klucza grupującego:

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

Istnieje również bezpośrednia .aggregate() metoda na instancjach mongoTemplate, która ma wiele metod pomocniczych do budowania potoków. Ale to powinno wskazać ci przynajmniej właściwy kierunek.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $tan

  2. Jak przekazać ciąg json do dokumentu bson w celu zapisania do MongoDB?

  3. Jak sprawdzić, które zapytania używają indeksu w MongoDB?

  4. Tło mongo createIndex blokuje powłokę

  5. Błąd Mongod (zainstalowany z homebrew)