2013-08-08 13 views
27

Sto utilizzando MongoDB nella mia applicazione ed è stato necessario inserire più documenti all'interno di una raccolta MongoDB. La versione che sto usando è di 1,6Come inserire più documenti contemporaneamente in MongoDB tramite Java

ho visto un esempio qui

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

nelle

Inserimento di massa più documenti Sezione

dove l'autore stava passando un array per fare questo.

Quando ho provato lo stesso, ma perché non lo consente, e per favore dimmi come posso inserire più documenti contemporaneamente?

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

    } 

} 

Per favore fatemi sapere qual è il modo in cui posso inserire più documenti contemporaneamente tramite java.

+0

Potete dare un'occhiata al mio risposta in un altro thread .. http://stackoverflow.com/questions/31470702/bulk-upsert-with-mongodb-java-3-0-driver/39356860 # 39356860 –

risposta

38

DBCollection.insert accetta un parametro di tipo DBObject, List<DBObject> o un array di DBObject s per l'inserimento di più documenti contemporaneamente. Stai passando un array di stringhe.

Devi popolare manualmente documenti (DBObject s), inserirli in un List<DBObject> o un array di DBObject s ed eventualmente 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); 

È possibile che questo frammento è essenzialmente lo stesso del comando si rilasciano nella shell MongoDB:

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

grazie, c'è qualche altro modo per farlo, immagino che creare troppi DBObject sia probmalitico dato che ho bisogno di creare quasi 100. Quindi c'è un altro modo per questo? – Kiran

+1

Non sono sicuro di altri modi, ma utilizzando Spring Data [MongoOperations.insert()] (http://static.springsource.org/spring-data/data-mongodb/docs/1.1.0.M1/api/) , puoi liberarti della parte di creazione 'DBObject' (Spring lo fa per te). –

+0

Come possiamo farlo attraverso le API di Spring Data Mongo? Grazie, Deepa – Prateek

17

Come di MongoDB 2.6 e 2.12 versione del driver è anche possibile ora fare un bulk insert operation. In Java è possibile utilizzare lo BulkWriteOperation. Un esempio di uso di questo potrebbe essere:

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

Prima 3.0, è possibile utilizzare sotto il codice in 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(); 

Se si utilizza MongoDB versione 3.0, è possibile utilizzare

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

Il formato del record inserito come in MongoDB che interrompe la query da qualsiasi origine 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); 
} 
2

creazione di documenti

Ci sono due comandi principali per la creazione di documenti in MongoDB:

  • insertOne()
  • insertMany()

Ci sono altri modi bene come Update comandi. Chiamiamo queste operazioni, upserts. Upserts si verifica quando non ci sono documenti che corrispondono al selettore utilizzato per identificare i documenti.

Sebbene MongoDB inserisca l'ID di sua proprietà, è possibile inserire manualmente ID personalizzati anche specificando il parametro _id nelle funzioni insert...().

Per inserire più documenti, è possibile utilizzare insertMany(), che accetta come parametri una serie di documenti. Quando viene eseguito, restituisce più id s per ciascun documento nell'array. Per eliminare la raccolta, utilizzare il comando drop(). A volte, quando si eseguono inserimenti di massa, possiamo inserire valori duplicati. In particolare, se si tenta di inserire duplicati _id s, otterremo la duplicate key error:

 

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

MongoDB duplicate key error

MongoDB blocca il funzionamento di inserire, se si verifica un errore, per sopprimere che - siamo in grado di fornire dei parametri ordered:false . Es:

 

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