Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MongoDB Java中过滤文档或子文档中的数组_Java_Mongodb_Bson_Mongo Java Driver - Fatal编程技术网

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

在MongoDB Java中过滤文档或子文档中的数组,java,mongodb,bson,mongo-java-driver,Java,Mongodb,Bson,Mongo Java Driver,我的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("lastTime

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

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

您的要求是检查字段
信号
是阵列且不是空的。然后,为所有数组元素打印来自数组子文档元素的字段(
value
)值

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

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

注意事项:

您可以使用
filters.and
将我定义的过滤器与代码中的过滤器
MyFilter
组合起来(以检查字段是否为数组且数组是否包含元素)

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

请以文本(而非图像)格式发布一个示例输入文档-您想要讨论的文档。好的,我编辑了该帖子。这对@Moslem没有用处。您必须发布输入文档的JSON格式。尝试使用MongoShell或Compass之类的GUI工具,复制一个文档并将其发布到这里。它成功了!非常感谢。我只想更深入地了解一下MongoDB中的数据。正如您在MongoCompass照片中看到的,Signals数组有很多字段,例如“Write”、“type”、“stability”。甚至在数组“signals”之前,我们还有一些字段,例如“id”、“manufacturer”。如果我想要一些基于数组字段的过滤器呢?例如,一个基于“稳定性”的过滤器,如果我想同时拥有一个基于“制造商”的过滤器呢?然后基于这些过滤器,我想取“值字段”的值,有可能吗?要基于
类型
等字段过滤数组(如
信号
),必须使用聚合查询。下面是一个例子:。将过滤器与数组字段和标量字段(如
id
)相结合的方法聚合查询就是一种方法。像
id
manufacturer
这样的字段可以在an的
$match
阶段进行筛选。这是我几天前回答的一个字段:。
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
// MongoDB Java driver imports
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.client.*;
import static com.mongodb.client.model.Filters.*;