我刚学会了如何使用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,但不是聚合器。
答案 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));