Ma structure json MongoDB est
{
"_id" : "122134231234234",
"name" : "Total_pop",
"description" : "sales category",
"source" : "public",
"dataset" :"d1"
},
{
"_id" : "1123421231234234",
"name" : "Total_pop",
"description" : "sales category",
"source" : "public",
"dataset" :"d1"
},
{
"_id" : "12312342332423343",
"name" : "Total_pop",
"description" : "sales category",
"source" : "private",
"description" : "d1"
}
J'ai besoin d'obtenir une collection distincte de l'ensemble de données dont la source est publique. J'ai essayé cette requête, et cela n'a pas fonctionné:
Criteria criteria = new Criteria();
criteria.where("source").in("public");
query.addCriteria(criteria);
query.fields().include("name");
query.fields().include("description");
query.fields().include("description");
query.fields().include("source"); List list =
mongoTemplate.getCollection("collectionname").distinct("source", query);
Pouvez vous me donner un coup de main?
D'une part, la .getCollection()
méthode renvoie l'objet de base de la collection Driver comme suit:
DBCollection collection = mongoTemplate.getCollection("collectionName");
Le type d'objet de requête peut donc être différent de celui que vous utilisez, mais il y a aussi d'autres choses. A savoir que .distinct()
ne renvoie que les valeurs "distint" de la clé que vous avez demandée, et ne renvoie pas d'autres champs du document. Vous pourriez donc faire:
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());
Mais cela ne retournera que "sample" comme un seul élément dans la liste par exemple.
Si vous voulez les "champs" d'un ensemble distinct, utilisez .aggregate()
plutôt la méthode. Avec les "premières" occurrences des autres valeurs de champ pour la clé distincte:
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);
Ou les valeurs "distinctes" réelles de plusieurs champs, en les faisant tous partie de la clé de regroupement:
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);
Il existe également une .aggregate()
méthode directe sur les instances mongoTemplate, qui dispose d'un certain nombre de méthodes d'assistance pour créer des pipelines. Mais cela devrait au moins vous diriger dans la bonne direction.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots