首页 > 解决方案 > 在 MongoDB Java 中过滤文档或子文档中的数组

问题描述

我的 Java 代码:

MongoCollection<Document> coll = mongoClient.getDatabase(dbs.get(0)).getCollection(dbc.get(2));
    Bson Myfilter=Filters.and(Filters.eq("id", "144-12"), Filters.gte("lastTimestamp",StartPeriod ),
                Filters.lte("lastTimestamp", FinishTime));
    FindIterable<Document>  doc=coll.find(Myfilter).limit(5);
    for (Document Document : doc) {
        System.out.println(Document);
    }

如需更多帮助,请使用相应的 Mongo Compass 屏幕截图来显示数据结构:

在此处输入图像描述

以及 Mongo Compass 的另一个屏幕截图,我已将 JSON 文档复制到红色矩形内:

在此处输入图像描述

{"_id":"5db06ab680bd68ca32a84c6e","disconnected":false,"id":"144-12","lastTimestamp":"1571842738588","manufacturer":"gmb","modelName":"GMB_Mod1","signals":[{"event":"changed","signal":"InjectionUnitCycleParametersType.DosingTime","stability":"unstable","timestamp":"1571842736566","type":"INTEGER","value":"0","writable":"read","written":false},{"event":"changed","signal":"InterfaceType.Jobs.ActiveJobValues.LastCycleTime","stability":"unstable","timestamp":"1571842736584","type":"INTEGER","value":"0","writable":"read","written":false}],"tC":10}

我想尝试将过滤器与数组字段和标量字段结合起来。例如在照片中,我想结合基于数组的“制造商”字段和“书面”字段的过滤器

标签: javamongodbbsonmongo-java-driver

解决方案


您的要求是检查字段signals是否为数组且不为value然后,从数组子文档元素中为所有数组元素打印一个字段 ( ) 值。

以下是如何实现的示例。我正在使用示例文档并打印fldA值。以下 Java 代码具有数组检查:

{ _id: 1, arr: [ { fldA: 11, fldB: "str123"}, { fldA: 29, fldB: "strxyz"} ] },
{ _id: 2, arr: [ ] }

Java 代码:

MongoClient mongoClient = MongoClients.create("mongodb://localhost/");
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document>collection = database.getCollection("arrays");

Bson filterType = type("arr", "array");
Bson filterXpr = expr(Document.parse("{ $gt: [ { $size: '$arr' }, 0 ] }"));
List<Document> list = new ArrayList<>();

collection.find(and(filterType, filterXpr))
               .limit(2)
               .iterator()
               .forEachRemaining(list::add);

for ( Document doc: list) {
    List<Document> arr = (List<Document>) doc.get("arr");
    arr.forEach(e -> System.out.println(e.get("fldA")));
}

输出:

11
29

笔记:

您可以MyFilter使用Filters.and.

// MongoDB Java driver imports
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.client.*;
import static com.mongodb.client.model.Filters.*;

推荐阅读