Mongodb与java中的in子句不同

时间:2015-12-18 13:11:28

标签: java mongodb mongodb-query

我有一个mongo db查询,我试图将其转换为java驱动程序查询。

 db.sourceReference.distinct('sourceName',{sourceReferenceId:{$in:['565555ef4ee29e068f61dd74','565555ef4ee29e068f61dd73','565555ef4ee29e06882e6151']}})

我的尝试没有成功。任何人都可以帮助我将上述查询转换为等效的java代码。提前谢谢。

2 个答案:

答案 0 :(得分:1)

这可以通过不同的迭代来完成,并为其添加过滤器。

`       DistinctIterable<String> c = mongoDatabase.getCollection("sourceReference").distinct("sourceName",String.class).filter(new Document("sourceReferenceId",new Document("$in",sourceReferenceList)));
`

这里sourceReferenceList是一个包含所需过滤器值的数组列表。

答案 1 :(得分:0)

您可以使用和不使用不同查询来获取文档。

1)没有明确的查询: 只需使用HashSet过滤重复项。

List<String> list = new ArrayList<String>();
list.add('565555ef4ee29e068f61dd74');
list.add('565555ef4ee29e068f61dd73');
list.add('565555ef4ee29e06882e6151');
Bson filter = and(in("sourceReferenceId", list));
Bson projection = fields(include("sourceName"), excludeId());
Set<Document> all = mongoCollection.find(filter)
            .projection(projection).into(new HashSet<Document>());

    for (Document cur : all) {
        System.out.println(cur);
    }

这应该为您提供所需的输出。此处重复数据由应用程序而非数据库删除,但易于使用。

2)具有不同的查询:

MongoCursor<String> l1 = mongoCollection.distinct("sourceName",
            String.class).iterator();
List<String> l3 = new ArrayList<String>();

    try{
        while(l1.hasNext()){
            l3.add(l1.next());
        }
    }finally{
        l1.close();
    }

这将给出不同sourceName字段的列表。同样,您必须遍历使用投影获取的文档列表,并过滤查询,如第一种方法所示。

我不是一个优秀的程序员,如果你知道更好的方法,很高兴编辑这段代码。

参考:Java MongoDB 3.0 driver query distinct without filter