首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用MongoDB异步驱动程序时,并非所有文档都会插入到Java中

在使用MongoDB异步驱动程序时,并非所有文档都会插入到Java中
EN

Stack Overflow用户
提问于 2016-02-18 00:29:32
回答 1查看 554关注 0票数 4

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

代码语言:javascript
复制
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中运行此语句时

代码语言:javascript
复制
db.getCollection("coll").count()

结果是我得到了93062。这个数字在每次运行时都会有所不同,但永远不会达到100.000。有人能解释一下为什么在我使用这段代码时,不是所有的对象都作为文档正确地存储在MongoDB中吗?我们在3台不同的机器上进行了测试,每台机器都暴露了相同的行为。

我感觉这是一个与驱动程序相关的问题,因为在这之后,我用node.js写了一个类似的实验:

代码语言:javascript
复制
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-example不是这样,并可能提供一个解决方案?

EN

回答 1

Stack Overflow用户

发布于 2016-02-18 15:30:28

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

当您检查结果时,可能插入过程尚未完成。

2016-02-19 15:00编辑

我做了同样的测试,得到了同样的结果。

但是当我更改下面的代码行时

代码语言:javascript
复制
 Document doc = new Document("name"+ i.toString(), "TESTING"); 

代码语言:javascript
复制
 Document doc = new Document("_id", "name"+ i.toString());

它恰好插入了100000个点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35462387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档