我在实验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不是这样的,并可能提供一个解决方案吗?
您是什么时候运行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只告诉我它返