mongodb mongoTemplate使用一些标准获得不同的字段

2022-09-04 08:14:54

My MongoDB json structure 是

 {
    "_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"
}

我需要获取与源是公共的数据集不同的集合。我尝试了这个查询,但它不起作用:

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

你能帮帮我吗?


答案 1

首先,该方法返回基本的驱动程序集合对象,如下所示:.getCollection()

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

因此,查询对象的类型可能与您正在使用的类型不同,但也有一些其他内容。也就是说,它只返回您请求的键的“distint”值,并且不返回文档的其他字段。所以你可以做:.distinct()

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

但是,这只会将“sample”作为列表中的单个元素返回。

如果需要来自不同集合的“字段”,请改用该方法。使用非重复键的其他字段值的“第一次”出现:.aggregate()

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

或者多个字段的实际“不同”值,方法是将它们全部设置为分组键的一部分:

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


答案 2

从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。