如何通过Java在MongoDB中一次插入多个文档

时间:2013-08-08 14:20:11

标签: java mongodb bulkinsert mongodb-java

我在我的应用程序中使用MongoDB,需要在MongoDB集合中插入多个文档。 我使用的版本是1.6

我在这里看到了一个例子

http://docs.mongodb.org/manual/core/create/

中的

批量插入多个文档部分

作者传递数组的地方。

当我尝试相同的,但为什么不允许,请告诉我如何一次插入多个文件?

package com;

import java.util.Date;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.MongoClient;

public class App {

    public static void main(String[] args) {
        try {
            MongoClient mongo = new MongoClient("localhost", 27017);
            DB db = mongo.getDB("at");
            DBCollection collection = db.getCollection("people");

            /*
             * BasicDBObject document = new BasicDBObject();
             * document.put("name", "mkyong"); document.put("age", 30);
             * document.put("createdDate", new Date()); table.insert(document);
             */

            String[] myStringArray = new String[] { "a", "b", "c" };

            collection.insert(myStringArray); // Compilation error at this line saying that "The method insert(DBObject...) in the type DBCollection is not applicable for the arguments (String[])"

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

请让我知道是什么方式,以便我可以通过java一次插入多个文档。

5 个答案:

答案 0 :(得分:41)

DBCollection.insert接受DBObjectList<DBObject>类型的参数或DBObject的数组,以便一次插入多个文档。你传入一个字符串数组。

您必须手动填充文档(DBObject s),将其插入List<DBObject>DBObject个数组,最后insert个。

DBObject document1 = new BasicDBObject();
document1.put("name", "Kiran");
document1.put("age", 20);

DBObject document2 = new BasicDBObject();
document2.put("name", "John");

List<DBObject> documents = new ArrayList<>();
documents.add(document1);
documents.add(document2);
collection.insert(documents);

上面的代码段与您在MongoDB shell中发出的命令基本相同:

db.people.insert( [ {name: "Kiran", age: 20}, {name: "John"} ]);

答案 1 :(得分:19)

在3.0之前,您可以在Java中使用以下代码

DB db = mongoClient.getDB("yourDB");
            DBCollection coll = db.getCollection("yourCollection");
            BulkWriteOperation builder = coll.initializeUnorderedBulkOperation();
            for(DBObject doc :yourList)
            {
                builder.insert(doc);
            }
            BulkWriteResult result = builder.execute();
            return result.isAcknowledged();

如果您使用 mongodb 3.0版,则可以使用

MongoDatabase database = mongoClient.getDatabase("yourDB");
            MongoCollection<Document> collection = database.getCollection("yourCollection");
            collection.insertMany(yourDocumentList);

答案 2 :(得分:17)

从MongoDB 2.6和2.12版驱动程序开始,您现在也可以执行bulk insert operation。在Java中,您可以使用BulkWriteOperation。使用它的一个例子可能是:

DBCollection coll = db.getCollection("user");
BulkWriteOperation bulk = coll.initializeUnorderedBulkOperation();
bulk.find(new BasicDBObject("z", 1)).upsert().update(new BasicDBObject("$inc", new BasicDBObject("y", -1)));
bulk.find(new BasicDBObject("z", 1)).upsert().update(new BasicDBObject("$inc", new BasicDBObject("y", -1)));
bulk.execute();

答案 3 :(得分:2)

您的插入记录格式,如MongoDB中查询从任何来源退出 EG。

 {
    "_id" : 1,
    "name" : a
}
{
    "_id" : 2,
    "name" : b,
} 

mongodb 3.0

FindIterable<Document> resulutlist = collection.find(query);            
List docList = new ArrayList();
for (Document document : resulutlist) {
    docList.add(document);
}

if(!docList.isEmpty()){
    collectionCube.insertMany(docList);
}   

答案 4 :(得分:2)

创建文档

在MongoDB中创建文档有两个主要命令:

  • insertOne()
  • insertMany()

还有其他方法,例如Update命令。我们将这些操作称为upserts。如果没有与用于识别文档的选择器匹配的文档,则会发生Upsert。

虽然MongoDB通过它自己插入ID,但我们也可以通过在_id函数中指定insert...()参数来手动插入自定义ID。

要插入多个文档,我们可以使用insertMany() - 它将一组文档作为参数。执行时,它会为数组中的每个文档返回多个id s。要删除集合,请使用drop()命令。有时,在进行批量插入时 - 我们可能会插入重复值。具体来说,如果我们尝试插入重复的_id,我们将获得duplicate key error


db.startup.insertMany(
  [
  {_id:"id1", name:"Uber"},
  {_id:"id2", name:"Airbnb"},
  {_id:"id1", name:"Uber"},
  ]
  );

MongoDB duplicate key error

如果遇到错误,MongoDB会停止插入操作,以阻止它 - 我们可以提供ordered:false参数。例如:


db.startup.insertMany(
[
{_id:"id1", name:"Uber"},
{_id:"id2", name:"Airbnb"},
{_id:"id1", name:"Airbnb"},
],
{ordered: false}
);