当前位置: 首页 > 知识库问答 >
问题:

当使用异步驱动程序for Java时,并不是所有的文档都插入到MongoDB中

芮念
2023-03-14

我在实验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个文档插入到Mongo数据库的集合“coll”中,该数据库名为“MongoTest”。然而,当我运行这段代码后检查元素数量时,却丢失了数千个文档。

在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-example不是这样的,并可能提供一个解决方案吗?

共有1个答案

何勇
2023-03-14

您是什么时候运行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());
 类似资料:
  • 我尝试使用scala 2.11.7在mongodb 3.0.7中保存一个文档,然后进行快速访问:http://mongodb.github.io/mongo-scala-driver/1.0/gett-start/quick-tour/,但是我运行了这个示例,没有发生任何事情。不创建数据库、集合和文档。 控制台: 少了什么?

  • 问题内容: 有没有一种简单的方法可以使用Java驱动程序获取mongoDB实例最后插入的文档的ID(对象ID)? 问题答案: 我刚刚意识到您可以这样做:

  • 有人能给我举个例子,说明如何使用PHPs新驱动程序计算MongoDB集合中的文档数吗(http://php.net/manual/en/set.mongodb.php) 所有示例似乎都在使用旧的驱动程序或库!

  • 我试图使用servlet上的Java驱动程序连接到托管在mlab上的MongoDB数据库。 问题是我得到以下错误: 这样做对吗?我还应该做什么/代替吗?

  • 在上面的代码中,我试图更新文档中的属性子集。更新后,我看到整个文档被子集替换了。有没有办法用mongo-java-driver的bulkwrite操作来更新属性子集?

  • < li >感谢您点击这个问题!我已经尽了最大努力让这件事尽可能彻底。 < li >但是,如果您需要进一步澄清,请随时告诉我! < li >如果您认为问题太长。你可以读第三个 Mongodb Java 驱动程序: org.mongodb:mongo-java-driver:3.11.0-rc0 查找具有特定“名称”字段的特定文档 然后更新其他字段或整个文档 从不返回null。 Java只告诉我它返