- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 groovy 脚本,它使用 Mongo Java 驱动程序 mongo-java-driver-2.8.0.jar 访问单个集合中的所有记录,更新任何与预期结构不匹配的记录。该脚本运行得非常出色,但我一直在摸不着头脑,为什么它处理的记录多于集合实际拥有的记录。或者,更准确地说,dbCursore.hasNext() 遍历比集合实际拥有的记录更多的记录。只有当脚本找到要更新的内容时才会发生这种情况。如果脚本执行时没有更新,则处理的总数是正确的。
hasNext() 是“重新开始”还是记录在迭代中移动(如果已更新)?
这是代码...
static def doIt( mongo, normalizer, isDryRun ) {
def ttlProcessed = 0
def ttlCandidates = 0
def ttlUpdated = 0
def lapCount = 0;
def lapStartTime = System.currentTimeMillis();
def db = mongo.getDB( "devices" )
DBCollection dbCollection = db.getCollection( "profiles" )
DBCursor dbCursor = dbCollection.find();
while ( dbCursor.hasNext() ) {
DBObject source = dbCursor.next();
DBObject normalized = normalizer.normalize( source )
// Only update if changed...
if ( ! ( source.equals( normalized ) ) ) {
ttlCandidates++
if ( !isDryRun ) {
BasicDBObject searchQuery = new BasicDBObject( "_id", normalized.get( "_id" ) )
WriteResult result = dbCollection.update( searchQuery, normalized, false, false, WriteConcern.SAFE );
ttlUpdated++
}
}
ttlProcessed++;
if ( ttlProcessed % 10000 == 0 ) {
printErr "split: ${lapCount}, splitElapsed: ${calcElapsed( lapStartTime) } ms, elapsed: ${calcElapsed( startTime )} ms, processed: ${ttlProcessed}, candidates: ${ttlCandidates}, updated: ${ttlUpdated}"
lapCount++
lapStartTime = System.currentTimeMillis()
}
}
printErr "split: ${lapCount}, splitElapsed: ${calcElapsed( lapStartTime) } ms, elapsed: ${calcElapsed( startTime )} ms, processed: ${ttlProcessed}, candidates: ${ttlCandidates}, updated: ${ttlUpdated}"
}
如果运行更新了任何记录,ttlProcessed 是如何获得比正在处理的集合计数更高的值的?
最佳答案
这可能是因为更新导致文档移动(通常是因为增长)。如果文档确实增长并再次处理,它将算作一次迭代,但假设您的更新是幂等的(我没有测试过),那么这将不是问题。
您可以使用$snapshot
option如果这是一个问题,可以解决这个问题。我还建议阅读此书:
http://www.mongodb.org/display/DOCS/How+to+do+Snapshotted+Queries+in+the+Mongo+Database
这些问题本质上是 mongodump 和 mongoexport 等工具遍历 _id 索引(即默认使用 $snapshot
)的原因。
如果您想首先研究防止移动,请查看填充因子页面上的此部分:
http://www.mongodb.org/display/DOCS/Padding+Factor#PaddingFactor-ManualPadding
2.2中还有选项可以在运行compact命令时设置padding:
http://docs.mongodb.org/manual/release-notes/2.2/#padding-specifiable-on-compact-command
关于mongodb - DBCursor hasNext() 处理的记录多于 DBCollection 实际拥有的记录……为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145579/
这两种方法看起来都是将一个BasicDbObject保存到一个集合实例中。这两种方法有什么区别呢?com.mongodb.DBCollection.Insert()com.mongodb.DBColl
我正在通过我的 Java 代码创建一个 mongodb 集合,我想在此集合上创建索引,但是根据在线教程,我意识到创建后台索引更可取,因为它不会锁定集合以创建索引。相同的代码如下: DBCollect
什么时候应该使用 MongoCollection,什么时候使用 DBCollection?同样的问题也适用于 DBObject、BasicDBObject、Document。似乎有不同的东西是相似的。
我想借助基于 lastUpdated 字段的排序返回查找查询的结果。 目前我看到了两种方式 第一种方法 BasicDBObject query = new BasicDBObject(); query
我有一个 groovy 脚本,它使用 Mongo Java 驱动程序 mongo-java-driver-2.8.0.jar 访问单个集合中的所有记录,更新任何与预期结构不匹配的记录。该脚本运行得非常
我正在尝试将 spring-data-mongodb 从 1.5 升级到 2.1.0.M3所以我修改了pom依赖: org.springframework.data
我们当前的实现是 mongo-java-driver:3.0.4文档更新如下 - private void updateParam(String param1, String param2) {
我正在使用最新的库更新 2014 年 Java 项目,MongoDB Java 驱动程序从 3.0 更改为 3.6。大多数代码已更新,但有一个特定的查询非常复杂,这给我带来了问题。 文档是这样的 {
我正在使用 Mongodb 和 java 并尝试创建一个文档: // mongo-java-driver-2.10.1 version // create a document to store ke
我需要创建一个数据库补丁,将 MongoDB 集合的所有元素更新为新格式。例如,经过大大简化,旧格式的文档如下: { "_id" : ObjectId("572a7f30200cd11355083
我已经将我的 springBoot 版本从 1.5.4 升级到 2.1.0.RELEASE。我有以下代码造成了麻烦。 MongoCollection collection1 = mongoTempla
我是一名优秀的程序员,十分优秀!