【发布时间】:2016-09-19 16:43:42
【问题描述】:
我有一个包含许多带有整数数组的文档的集合。我正在尝试查找集合中的任何位置是否存在设置/编号。在外壳中它工作正常:
> 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 驱动程序使其工作。但我不知道如何判断 find 是否真的找到了一些东西。
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
}
}
我觉得我以某种方式使这变得比应有的更难。在外壳中,这很容易。我真的很讨厌必须遍历每个集合的文档来检查数组中是否存在数字,但是我花了更多的时间试图找到“有效”的方法,而不是暴力破解它。
【问题讨论】:
-
您在 java 代码中使用的是
$eleMatch,而不是$elemMatch。这可能是问题吗?对于性能,我会查看聚合方法并按 id 聚合结果,后面的计数。一个请求就可以完成 -
抱歉,这是复制/粘贴错误。