我正在尝试使用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示例不是这种情况,并可能提供解决方案吗?