私はしばらくの間グーグルをしてきましたが、SpringDataMongoDBが一括保存をサポートしているかどうかはわかりません。
ドキュメントのコレクションをアトミックとしてmongoに保存する必要があります。すべて保存されているか、保存されていないかのどちらかです。
誰かがこのためのリンクまたはいくつかのサンプルコードを共有できますか?
私はしばらくの間グーグルをしてきましたが、SpringDataMongoDBが一括保存をサポートしているかどうかはわかりません。
ドキュメントのコレクションをアトミックとしてmongoに保存する必要があります。すべて保存されているか、保存されていないかのどちらかです。
誰かがこのためのリンクまたはいくつかのサンプルコードを共有できますか?
MongoDB Javaドライバーを介して保存を行う場合、MongoDBに渡すことができるドキュメントは1つだけです。
挿入を行うときは、単一の要素を渡すことも、要素の配列を渡すこともできます。後者は「一括挿入」の結果になります(つまり、クライアントによる単一の挿入コマンドにより、サーバーに複数のドキュメントが挿入されます)。
ただし、MongoDBはトランザクションの概念をサポートしていないため、挿入の1つが失敗した場合、以前に挿入されたドキュメントを削除またはロールバックする必要があることを示す方法はありません。
アトミック性の目的で、各ドキュメント挿入は個別の操作であり、MongoDBにすべてを挿入するか、まったく挿入しないようにするサポートされている方法はありません。
これがアプリケーションで必要な場合は、他の方法で実現できます。-単一の親ドキュメントのサブドキュメントになるようにスキーマを変更します(技術的には、親ドキュメントの「挿入」が1つだけになります)-トランザクションを記述しますアプリケーションコードへのセマンティクス-2フェーズコミットトランザクションをネイティブにサポートするデータベースを使用します。
SpringDataとMongoDriverを使用して、あるデータベースサーバーから別のデータベースサーバーにデータをコピーしました。
import com.mongodb.MongoBulkWriteException;
import com.mongodb.MongoClient;
import com.mongodb.MongoException;
import com.mongodb.bulk.BulkWriteResult;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.BulkWriteOptions;
import com.mongodb.client.model.InsertOneModel;
import com.mongodb.client.model.WriteModel;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
@Component
public class DataCopy{
public void copyData(MongoTemplate sourceMongo,MongoTemplate destinationMongo ){
Class cls = EmployeeEntity.class;
String collectionName = sourceMongo.getCollectionName(cls).get();
MongoCollection<Document> collection = destinationMongo.getCollection(collectionName);
Query findQuery = new Query();
Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("firstName").is("someName"),
Criteria.where("lastName").is("surname"));
query.addCriteria(criteria);
Pageable pageable = PageRequest.of(0, 10000);
findQuery.with(pageable);
List<?> pagedResult = sourceMongo.find(findQuery, cls).get()
while (!pagedResult.isEmpty()) {
try {
BulkWriteResult result = collection.bulkWrite(
pagedResult.
stream().map(d -> mapWriteModel(d, destinationMongo)).collect(Collectors.toList()),
new BulkWriteOptions().ordered(false));
} catch (Exception e) {
log.error("failed to copy", e);
}
pageable = pageable.next();
findQuery.with(pageable);
pagedResult = sourceMongo.find(findQuery, cls).get();
}
}
}
private WriteModel<? extends Document> mapWriteModel(Object obj,
MongoTemplate mongoTemplate
) {
Document document = new Document();
mongoTemplate.getConverter().write(obj, document);
return new InsertOneModel<>(document);
}
// Code example to create mongo templates for source and target databases
MongoClient targetClient = new MongoClient("databaseUri")
MongoTemplate destinationMongo = new MongoTemplate(targetClient, "databaseName");
これがお役に立てば幸いです。