在MongoDB Java中过滤文档或子文档中的数组

问题描述 投票:0回答:1

我是MongoDB和Java的新手,我正在尝试通过学习它来学习它。我正在处理存储在MongoDB中的一些数据,我想通过Mongo Java驱动程序进行一些变通。我通过连接到MongoDB并通过以下代码从数据库中的数据收集中设置了一些数据来进行了简单的测试:

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);
    }

结果仅是以下文本和屏幕截图:

enter image description here

以及包括我的主要目标的屏幕快照的遗漏之处如下:

enter image description hereenter image description here

[第二和第三张图像只是第一张图像中连续丢失的部分,很抱歉,我不想将结果作为文本输入,因为屏幕截图更易读。

您可以在屏幕快照中看到,整个结果为5行,结果的前3行包含嵌套的数组和文档。我的第一个问题是进行过滤,并根据“信号”字段获取结果。我的意思是我想避免空信号,更确切地说,我想避免第4行和第5行的“信号”字段为空。

[我的第二个问题是,如果有人可以帮助我如何访问数组中特定字段的值,我将非常感激,例如第二个和第三个屏幕截图,这是第一个屏幕截图中“ signals”字段的延续部分,我想阅读“值”字段的内容。有任何提示吗?

要获得更多帮助,请使用相应的Mongo Compass屏幕截图以显示数据结构:

enter image description here

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

enter image description here

{"_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}

很抱歉,时间太长。我刚刚开始学习MongoDB和Java,我的脑海中有很多问题,我感到非常兴奋。如果有人给我我的Java代码反馈,我也欢迎。

java mongodb bson mongo-java-driver
1个回答
0
投票

您的要求是检查字段signalsarray还是not not empty。然后,为所有数组元素打印数组子文档元素中的字段(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.*;
© www.soinside.com 2019 - 2024. All rights reserved.