使用Java异步驱动程序时,不是所有文档都会插入MongoDB

4

我正在尝试使用mongodb-async驱动程序(http://mongodb.github.io/mongo-java-driver/3.0/driver-async/),并注意到了奇怪的行为。我在基础代码中重现了这种奇怪的行为:

import com.mongodb.async.SingleResultCallback;
import com.mongodb.async.client.MongoClient;
import com.mongodb.async.client.MongoClients;
import com.mongodb.async.client.MongoCollection;
import com.mongodb.async.client.MongoDatabase;
import org.bson.Document;


public class main {
    public static void main(String [] args)
    {
        MongoClient mongoClient = MongoClients.create();
        MongoDatabase database = mongoClient.getDatabase("mongotest");
        MongoCollection<Document> collection = database.getCollection("coll");


        for(Integer i = 0; i < 100000; i++) {
            Document doc = new Document("name"+ i.toString(), "TESTING");
            collection.insertOne(doc, new SingleResultCallback<Void>() {
                public void onResult(final Void result, final Throwable t) {
                    System.out.println("Inserted!");
                }
            });
        }


        while(true){
        }
    }
}

我希望这段代码能够将 100,000 个文档插入到名为 "mongotest" 的 mongo 数据库中的 'coll' 集合中。但是,运行此代码后,检查元素数量时发现数千个文档丢失了。
在 mongodb-shell 中运行此语句时,...
db.getCollection("coll").count()

我得到了93062作为结果。每次运行此代码时,此数字会有所变化,但从未达到100,000。有人能解释为什么不是所有对象都被正确地存储为MongoDB文档吗?我们在3台不同的机器上进行了测试,每台机器都表现出相同的行为。
我感觉这可能是与驱动程序相关的问题,因为我使用node.js编写了类似的实验:
var express = require('express');
var MongoClient = require('mongodb').MongoClient;
var app = express();
var url = 'mongodb://localhost:27017/mongotest';

MongoClient.connect(url, function (err, db) {
  for (var i = 0; i < 100000; i++) {
    var name = "name" + i;
    db.collection("coll").insertOne({
      name: name
    },function(err,results) {
      if(err==null) {
        console.log("Sweet");
      }
    });
  }
});


module.exports = app;

相比Java代码,这段代码运行时间更长,但当代码完成时,预期将有100,000个文档存在于集合中。

有人能解释一下为什么Java示例不是这种情况,并可能提供解决方案吗?

1个回答

0

你什么时候运行了db.getCollection("coll").count()来检查插入结果?

也许在你检查结果时,插入过程还没有完成。


2016年02月19日15:00编辑

我进行了相同的测试,得到了相同的结果。

但是当我改变以下这行代码时

 Document doc = new Document("name"+ i.toString(), "TESTING"); 

 Document doc = new Document("_id", "name"+ i.toString());

成功插入了100000个文档。


我在3分钟后再次检查,然后是10分钟,30分钟... 数字没有变化,所以我认为可以得出结论,它停止了有意义的工作。 - Simon
在第二个例子中插入了确切的100000个文档,这是很有趣的。你对这种奇怪的行为有解释吗? - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接