我有一个包含大量带整数数组的文档的集合。我试图找出集合中的任何位置是否存在设置/数字。在shell中它工作正常:
> db.col.find({ settings: { $elemMatch: { $eq : 310403 } } }).count()
1
> db.col.find({ settings: { $elemMatch: { $eq : 310403 } } },{_id:1})
{ "_id" : 897 }
> db.albums.find({ images: { $elemMatch: { $eq : 310404 } } }).count()
0
但我无法通过Java驱动程序使其工作。但我无法弄清楚如何判断发现是否真的找到了什么。
FindIterable<Document> checkForSetting;
for (int i = 0; i < 1000000; i++) {
checkForSetting = col.find(new Document("settings",new Document("$eleMatch",new Document("$eq",i)))).projection(new Document("_id",1));
if ( null, empty, not found,etc) {
...do something
}
}
我觉得我在某种程度上使它变得比它应该更难。在shell中,它是一个明智的选择。我真的很讨厌必须遍历每个集合的文档来检查数组中是否存在数字,但是我已经花费了更多的时间来寻找“有效”的方式,而不是蛮力地使用它。
答案 0 :(得分:1)
基本上,您有两种不同的情况:
(a)迭代收集,并为每一些结果做好准备。这是您使用find和您在问题中声明的FindIterable的地方。
(b)获取计数,这与shell示例中的计数完全相同:
col.count(<whateverfilter>)
顺便说一句:您应该真正了解实用程序类过滤器和预测。您的代码使用旧的和丑陋的样式,使用3.x系列的java驱动程序不再需要它。