MongoDB java 驱动程序使用 $in 过滤器创建文档

MongoDB java driver create Document with $in filter

我认为这应该很容易做到,但我就是想不通。 我想要实现的是这个查询

{inbox:{$in:["main","fun-inbox"]} ,status:"Open"}

我设法让它像这样工作

     Bson q = Filters
            .and(Filters
                    .in("inbox", inboxes),
                Filters
                    .eq("status", statusID));

但这不是一回事,因为我使用了 $and 运算符

可以使用 Document 来完成吗?

这是我尝试过的,我知道我定义它的方式是错误的,但我举这个例子只是为了更好地理解我想要实现的目标

     Document q1 = new Document()
             .append("inbox", Filters.in("inbox", inboxes))
             .append("status", statusID);

已将您的查询转换为 java 代码为 return 可迭代文档类型

FindIterable<Document> iterable = database.getCollection("mails").find(new Document("inbox", new Document("$in", inValues)).append("status", "open"));

inValues 是一个 ArrayList 作为

ArrayList<String> inValues = new ArrayList<String> ();
inValues.add("main");
inValues.add("fun-inbox");

你所拥有的是正确的,它不是明确地$anded。

Java Mongo driver 在幕后计算何时 $ 何时不 $。

例如

没有$and

Bson bson = Filters.and(Filters.in("inbox", inboxes), Filters.eq("status", status));

BsonDocument bsonDocument = bson.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry());

System.out.print(bsonDocument.toString()); //{ "inbox" : { "$in" : inboxes }, "status" : status }

$and

Bson bson = Filters.and(Filters.in("inbox", inboxes), Filters.eq("inbox", inbox));

BsonDocument bsonDocument = bson.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry());

System.out.print(bsonDocument.toString()); //{ "$and" : [{ "inbox" : { "$in" : inboxes } }, { "inbox" : inbox }] }