使用Java驱动程序复制mongo集合

时间:2014-07-09 18:28:23

标签: mongodb mongodb-java

我想将内容从一个集合复制到另一个集合。

在mongod中可以这样做:

db.tempMongoItem.find().forEach( function(x){db.mongoItem.insert(x)} )

使用Java Mongo Driver,我尝试:

DB db = mongoClient.getDB("mydb")

CommandResult result = db.command(“db.tempMongoItem.find()。forEach(function(x){db.mongoItem.insert(x)})”)

但我明白了:

result = [serverUsed:localhost:27017, ok:0.0, errmsg:no such cmd: db.tempMongoItem.find().forEach( function(x){db.mongoItem.insert(x)} ), code:59, bad cmd:[db.tempMongoItem.find().forEach( function(x){db.mongoItem.insert(x)} ):true]]

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

你需要模仿JS在Java中所做的事情,which means getting a cursor and iterating over it,将每个文档插入到新的集合中。

像这样的东西(coll是最新的,coll2是新的集合):

DBCursor cursor = coll.find();
try {
   while(cursor.hasNext()) {
       coll2.insert(cursor.next());
   }
} finally {
   cursor.close();
}

假设coll和coll2都是DBCollection类型。

由于看起来您正在同一个数据库中进行复制,如果您使用聚合框架$out阶段使用2.6 MongoDB,还有另一种方法可以执行此操作:

db.collection.aggregate({"$out":"newCollection"});

请注意,这仅限于输出到原始集合所在的同一个数据库中。

答案 1 :(得分:0)

以下JAVA代码将集合从源复制到目标数据库名称(使用mongodb-driver 3.0.4)

/** Clone a collection.
*
* @param fromCollectionName - The name of collection to be cloned
* @param toCollectionName   - The name of the cloned collection
* @param dbName             - The name of the database
*/
public void cloneCollection(String fromCollectionName, String toCollectionName, String dbName) throws MongoException {
    MongoCollection toCol = this.getCollection(toCollectionName, dbName);
    if (toCol != null) {
      throw new MongoException("The destination collection already exists.");
    }
    List<Document> ops = new ArrayList<>();
    ops.add(new Document("$out",toCollectionName));
    MongoCollection sourceCollection = this.getCollection(fromCollectionName, dbName);
    sourceCollection.aggregate(ops);
}

public MongoCollection getCollection(String collection, String dbName) {
    MongoClient mongo = new MongoClient(new ServerAddress("localhost", Integer.parseInt(port)));
    MongoDatabase database = mongo.getDatabase(dbName);
    return curdb.getCollection(collection); 
}

请注意,这不会复制您在源集合中创建的索引。你必须单独复制指数

答案 2 :(得分:0)

在Asya的响应之后,您可以使用Java 8 Lambda函数来执行以下操作:

collSource.find().forEach((Block<Document>) collTarget::insertOne);