加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

使用async-driver for Java时,并非所有文档都插入到MongoDB中

发布时间:2020-12-15 02:13:13 所属栏目:Java 来源:网络整理
导读:我正在尝试使用 mongodb-async驱动程序( http://mongodb.github.io/mongo-java-driver/3.0/driver-async/)并注意到奇怪的行为.我在底层代码中重现了奇怪的行为: import com.mongodb.async.SingleResultCallback;import com.mongodb.async.client.MongoClien
我正在尝试使用 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){
        }
    }
}

我希望这段代码能够将100000个文档插入名为“mongotest”的mongo-database的集合’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示例的情况,并可能提供解决方案?

解决方法

你什么时候运行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个装饰品.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读