我想将内容从一个集合复制到另一个集合。
在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]]
有什么想法吗?
答案 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);