【问题标题】:mongodb mongoTemplate get distinct field with some criteriamongodb mongoTemplate 获取具有某些条件的不同字段
【发布时间】:2015-10-16 14:39:21
【问题描述】:

我的 MongoDB json 结构是

 {
    "_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);

你能帮帮我吗?

【问题讨论】:

    标签: java mongodb spring-mongodb


    【解决方案1】:

    一方面,.getCollection() 方法返回基本的 Driver 集合对象,如下所示:

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

    所以查询对象的类型可能与您使用的不同,但也有一些其他的东西。即.distinct() 仅返回您要求的键的“distint”值,而不返回文档的其他字段。所以你可以这样做:

    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() 方法,它有许多帮助方法来构建管道。但这至少应该为您指明正确的方向。

    【讨论】:

    • 这在我的情况下不起作用:mongoTemplate.getCollection("collectionName") .distinct("source",query.getQueryObject());
    【解决方案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);
    

    这基本上可以找到国家/地区所在地址集合中的所有不同城市。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2017-05-09
      • 2012-06-18
      • 1970-01-01
      • 2017-03-30
      相关资源
      最近更新 更多