【问题标题】:How to insert multiple documents at once in MongoDB through Java如何通过Java在MongoDB中一次插入多个文档
【发布时间】:2013-08-08 14:20:11
【问题描述】:

我在我的应用程序中使用 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一次插入多个文档。

【问题讨论】:

标签: java mongodb bulkinsert mongodb-java


【解决方案1】:

DBCollection.insert 接受DBObject、List<DBObject> 类型的参数或DBObjects 的数组,用于一次插入多个文档。您正在传递一个字符串数组。

您必须手动填充文档 (DBObjects),将它们插入到 List<DBObject> 或 DBObjects 的数组中,最后插入到 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);

上面的 sn-p 与你在 MongoDB shell 中发出的命令基本相同:

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

【讨论】:

  • 谢谢,有没有其他方法可以做到这一点,我想创建太多 DBObject 会很麻烦,因为我需要创建近 100 个。所以还有其他方法吗??
  • 我不确定其他方式,但是使用Spring Data的MongoOperations.insert(),您可以摆脱DBObject创建部分(Spring为您完成)。
  • 我们如何通过 Spring Data Mongo API 做到这一点?谢谢,迪帕
【解决方案2】:

在 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 version 3.0 ,你可以使用

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

【讨论】:

    【解决方案3】:

    从 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();
    

    【讨论】:

      【解决方案4】:

      创建文档

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

      • insertOne()
      • insertMany()

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

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

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

      db.startup.insertMany( [ {_id:“id1”,名称:“优步”}, {_id:"id2", name:"Airbnb"}, {_id:“id1”,名称:“优步”}, ] );

      如果遇到错误,MongoDB 会停止插入操作,以抑制这种情况 - 我们可以提供 ordered:false 参数。例如:

      db.startup.insertMany( [ {_id:“id1”,名称:“优步”}, {_id:"id2", name:"Airbnb"}, {_id:“id1”,名称:“Airbnb”}, ], {订购:假} );

      【讨论】:

        【解决方案5】:

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

         {
            "_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);
        }   
        

        【讨论】:

        • 如果执行此操作会给出“message='E11000 重复密钥错误集合:”。如何解决这个问题?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-29
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多