Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java mongodb mongoTemplate使用一些条件获取不同的字段_Java_Mongodb_Spring Mongodb - Fatal编程技术网

Java mongodb mongoTemplate使用一些条件获取不同的字段

Java mongodb mongoTemplate使用一些条件获取不同的字段,java,mongodb,spring-mongodb,Java,Mongodb,Spring Mongodb,我的MongoDB json结构是 { "_id" : "122134231234234", "name" : "Total_pop", "description" : "sales category", "source" : "public", "dataset" :"d1" }, { "_id" : "1123421231234234", "name" : "Total_pop", "description" : "sal

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

您能帮我一下吗?

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

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 collection=mongoTemplate.getCollection(“collectionName”);
List pipeline=Arrays.asList(
新BasicDBObject($match),新BasicDBObject(“数据集”,“d1”),
新的BasicDBObject($group),
新的BasicDBObject(“\u id”,“$source”)
.append(“name”,新的BasicDBObject(“$first”,“$name”))
.append(“description”,新的BasicDBObject($first,“$description”))
)
);
AggregationOutput输出=collection.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",
                new BasicDBObject("source","$source")
                    .append("name","$name")
                    .append("description","$description")
            )
        )
    );

    AggregationOutput output = colllection.aggregate(pipeline);
DBCollection collection=mongoTemplate.getCollection(“collectionName”);
List pipeline=Arrays.asList(
新BasicDBObject($match),新BasicDBObject(“数据集”,“d1”),
新的BasicDBObject($group),
新的BasicDBObject(“\u id”,
新的BasicDBObject(“source”,“$source”)
.append(“name”,“$name”)
.append(“description”、“$description”)
)
)
);
AggregationOutput输出=collection.aggregate(管道);

mongoTemplate实例上已经有了一个直接的
.aggregate()
方法,它有许多帮助器方法来构建管道。但这至少应该为您指明了正确的方向。

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

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

这在我的例子中不起作用:
mongoTemplate.getCollection(“collectionName”).distinct(“source”,query.getQueryObject())