如何使用distinct / aggregate来获取与多个查询匹配的所有字段

时间:2016-06-22 09:46:47

标签: java mongodb mongodb-query mongodb-java

我刚学会了如何使用distinct。

我所做的是创建一个BasicDBObject,将查询参数作为我想要的相同的参数放置,并作为字段参数返回我想要的内容。

现在我想做类似的事情,但有几个问题。这意味着,我希望查询匹配文档的几个键(id和date必须与我得到的输入相同),并返回与集合中的那些匹配的会话。

我尝试过类似于find的东西,但是对于distinct,你可以在其中添加append()或put()更多字段到查询参数。

这种语法似乎不起作用,我发现没有人使用类似的代码,所以我想这是不可能的。

我找到了aggregate()方法,但它似乎用于匹配多个FIELDS,而不是查询。代码说明:

array.put(coll.distinct(field, query));

我希望该查询参数有多个键,以便所有字段都匹配我的输入,并且我找到匹配查询中两个(或多个)键的字段的唯一值。

提前致谢!

编辑:

基础知识:MongoDB 3.2.2

数据操作:

"Session" : "value1", "car" : "carNumber", "date" : "20130321"

我有一个非常大的集合,其中包含许多文档,其中包括这些文档。我想,给一个汽车和一个数字,得到每个UNIQUE会话值,并将其作为json返回(为此,到目前为止,我将值放入数组,并转换为json)。

驱动程序/框架特定问题:我不知道在mongodb shell中查询这个问题。我知道使用distinct,但不是聚合器。

2 个答案:

答案 0 :(得分:1)

您的问题中有多个部分。我想回答以粗体突出显示的最后一部分。该解决方案是用Java编写的,因为该线程被标记为Java。

以下代码将为您提供汽车和车号的不同会话值。您可以根据需要相应地更改过滤器。

以下代码满足您的要求的基本不同概念。我假设您可以将结果集中的代码添加到JSON中(您可以使用Jackson或Gson库来生成JSON)。

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;

public class MongoReadDistinct {

    public static void main(String[] args) {
        MongoClient client = new MongoClient();
        MongoDatabase database = client.getDatabase("cars");

        MongoCursor<String> mongoCursorIds = database
                .getCollection("sessions").distinct("Session",
                        Filters.and(Filters.eq("car", "Nisson_Note"), Filters.eq("carnumber", 123)), String.class)
                .iterator();

        while (mongoCursorIds.hasNext()) {
            System.out.println(mongoCursorIds.next());

            //You can convert the result to JSON
        }

    }

}

示例数据: -

/* 1 */
{
    "_id" : ObjectId("576a6860d317ab85059c76d4"),
    "Session" : "value1",
    "car" : "Nisson_Note",
    "carnumber" : 123,
    "date" : "20130321"
}

/* 2 */
{
    "_id" : ObjectId("576a6896d317ab85059c76d5"),
    "Session" : "value2",
    "car" : "Nisson_Note",
    "carnumber" : 123,
    "date" : "20130321"
}

/* 3 */
{
    "_id" : ObjectId("576a68b4d317ab85059c76d6"),
    "Session" : "value2",
    "car" : "Nisson_Note",
    "carnumber" : 123,
    "date" : "20140321"
}

<强>输出: -

VALUE1 值2

答案 1 :(得分:1)

好吧,回答我自己的问题,实际上可以在不同的方法中进行多次查询,可以在mongodb shell和java驱动程序中完成(不幸的是我没有得到其他工作的答案,不是错了,我只是没有管理。)

所以对于mongodb shell(我包括它因为我不知道这样做,这也是问题的一部分):

db.colectionLocalCC.distinct("Session", {date: "20130303", Car: "55"})

对于mongodb:

BasicDBObject query = new BasicDBObject();
        query.put("date", date);
        query.put("car",car);

        String fields = "Session";

        array.put(coll.distinct(fields, query));