mongodb mongoTemplate 获取具有某些条件的不同字段
mongodb mongoTemplate get distinct field with some criteria
我的MongoDBjson结构是
{
"_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"
}
我需要获取与来源为 public 的数据集不同的集合。
我试过这个查询,但没有成功:
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);
你能帮帮我吗?
一方面,.getCollection()
方法 return 是基本的 Driver 集合对象,如下所示:
DBCollection collection = mongoTemplate.getCollection("collectionName");
所以查询对象的类型可能与您使用的不同,但也有一些其他的东西。也就是说,.distinct()
仅 return 是您要求的键的 "distint" 值,而不是 return 文档的其他字段。所以你可以这样做:
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());
但这只会 return "sample" 作为列表中的单个元素。
如果您想要来自不同集合的 "fields",请改用 .aggregate()
方法。不同键的其他字段值出现 "first" 次:
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);
或多个字段的实际 "distinct" 值,通过使它们全部成为分组键的一部分:
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);
在 mongoTemplate 实例上已经有一个直接的 .aggregate()
方法,它有许多帮助方法来构建管道。但这至少应该为您指明正确的方向。
As of Spring Data Mongo 2.2.0 MongoTemplate 提供了一个函数来检索具有条件的不同字段,
Criteria criteria = new Criteria("country").is("IN");
Query query = new Query();
query.addCriteria(criteria);
return mongoTemplate.findDistinct(query,"city",Address.class,String.class);
基本上可以找到地址集合中国家/地区为 IN 的所有不同城市。
我的MongoDBjson结构是
{
"_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"
}
我需要获取与来源为 public 的数据集不同的集合。 我试过这个查询,但没有成功:
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);
你能帮帮我吗?
一方面,.getCollection()
方法 return 是基本的 Driver 集合对象,如下所示:
DBCollection collection = mongoTemplate.getCollection("collectionName");
所以查询对象的类型可能与您使用的不同,但也有一些其他的东西。也就是说,.distinct()
仅 return 是您要求的键的 "distint" 值,而不是 return 文档的其他字段。所以你可以这样做:
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());
但这只会 return "sample" 作为列表中的单个元素。
如果您想要来自不同集合的 "fields",请改用 .aggregate()
方法。不同键的其他字段值出现 "first" 次:
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);
或多个字段的实际 "distinct" 值,通过使它们全部成为分组键的一部分:
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);
在 mongoTemplate 实例上已经有一个直接的 .aggregate()
方法,它有许多帮助方法来构建管道。但这至少应该为您指明正确的方向。
As of Spring Data Mongo 2.2.0 MongoTemplate 提供了一个函数来检索具有条件的不同字段,
Criteria criteria = new Criteria("country").is("IN");
Query query = new Query();
query.addCriteria(criteria);
return mongoTemplate.findDistinct(query,"city",Address.class,String.class);
基本上可以找到地址集合中国家/地区为 IN 的所有不同城市。