【问题标题】:Mongo 3.2 Java Driver - Find & Count OperationsMongo 3.2 Java 驱动程序 - 查找和计数操作
【发布时间】: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 聚合结果,后面的计数。一个请求就可以完成
  • 抱歉,这是复制/粘贴错误。

标签: java mongodb find


【解决方案1】:

基本上,你有两种不同的情况:

(a) 遍历集合,并为每一个结果做好准备。这是您使用 find 和您在问题中声明的 FindIterable 的地方。

(b) 获取计数,这与您的 shell 示例中的完全相同:

 col.count(<whateverfilter>)

顺便说一句:您应该真正了解一下实用程序类 Filters 和 Projections。您的代码使用了陈旧而丑陋的风格,对于 3.x 系列的 java 驱动程序应该不再需要了。

【讨论】:

  • 谢谢,我被“find”然后“count”挂断了!关于从 Mongo 3.0 (stackoverflow.com/questions/32683458/…) 中删除计数的评论让我感到困惑,但无法相信驱动程序中不存在这样一个有用的功能。
猜你喜欢
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2016-02-16
相关资源
最近更新 更多