sql >> Databáze >  >> NoSQL >> MongoDB

mongodb mongoTemplate získat odlišné pole s některými kritérii

Za prvé .getCollection() metoda vrací základní objekt kolekce Driver takto:

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

Typ objektu dotazu se tedy může lišit od toho, co používáte, ale jsou zde také některé další věci. Konkrétně .distinct() vrátí pouze "distant" hodnoty klíče, které jste požadovali, a nevrátí ostatní pole dokumentu. Takže můžete udělat:

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 například vrátí "vzorek" jako jeden prvek v seznamu.

Pokud chcete "pole" z odlišné sady, použijte .aggregate() místo toho. Buď s "prvními" výskyty ostatních hodnot pole pro odlišný klíč:

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

Nebo skutečné "odlišné" hodnoty více polí tím, že se všechny stanou součástí seskupovacího klíče:

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

Existují také přímé .aggregate() metoda již na instancích mongoTemplate, která má řadu pomocných metod pro vytváření potrubí. Ale to by vás mělo nasměrovat alespoň správným směrem.



  1. Co je pole __v v Mongoose

  2. Průvodce Upsert v MongoDB

  3. Synchronizujte MongoDb s ElasticSearch

  4. Nahrání souboru Node.js (Express 4, MongoDB, GridFS, GridFS-Stream)