|
@@ -0,0 +1,149 @@
|
|
|
+import com.mongodb.client.model.UpdateOneModel;
|
|
|
+import org.bson.*;
|
|
|
+
|
|
|
+import java.io.BufferedInputStream;
|
|
|
+import java.io.File;
|
|
|
+import java.io.InputStream;
|
|
|
+import java.nio.file.Files;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * MongoParseTest$
|
|
|
+ *
|
|
|
+ * @author wukai
|
|
|
+ * @date 2024/4/19 13:00
|
|
|
+ */
|
|
|
+public class MongoParseTest {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ String fileName = "D:\\SYSTEM\\Desktop\\temp\\sync\\oplog.rs.bson";
|
|
|
+ parse(fileName);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 如果是分片集群,则单独处理
|
|
|
+ *
|
|
|
+ * @param filename 文件名
|
|
|
+ */
|
|
|
+ public static void parse(String filename) {
|
|
|
+ File file = new File(filename);
|
|
|
+ BSONDecoder decoder = new BasicBSONDecoder();
|
|
|
+
|
|
|
+ try (InputStream inputStream = new BufferedInputStream(Files.newInputStream(file.toPath()));) {
|
|
|
+ Map<String, List<BasicBSONObject>> iMap = new HashMap<>(16);
|
|
|
+// Map<String, List<Pair<Bson, Document>>> uMap = new HashMap<>(16);
|
|
|
+ Map<String, List<UpdateOneModel<Document>>> mMap = new HashMap<>(16);
|
|
|
+ long records = 0;
|
|
|
+ long iIndex = 0;
|
|
|
+ long uIndex = 0;
|
|
|
+ long cIndex = 0;
|
|
|
+
|
|
|
+
|
|
|
+ while (inputStream.available() > 0) {
|
|
|
+// if (records % 10000 == 0) {
|
|
|
+// System.err.println("正在解析文件:{},当前处理记录数:{}" + filename + records);
|
|
|
+// }
|
|
|
+ BSONObject obj = decoder.readObject(inputStream);
|
|
|
+ if (obj == null) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //操作符
|
|
|
+ String op = obj.get("op").toString();
|
|
|
+ //数据库和表名
|
|
|
+ String ns = obj.get("ns").toString();
|
|
|
+ if (ns.startsWith("config.system.")) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ BasicBSONObject bson = (BasicBSONObject) obj.get("o");
|
|
|
+ if ("i".equals(op)) {
|
|
|
+ iIndex++;
|
|
|
+ } else if ("u".equals(op)) {
|
|
|
+ uIndex++;
|
|
|
+// // 数据更新
|
|
|
+//// List<Pair<Bson, Document>> updates = uMap.get(ns);
|
|
|
+// List<UpdateOneModel<Document>> us = mMap.get(ns);
|
|
|
+// if (us == null) {
|
|
|
+// us = new ArrayList<>();
|
|
|
+// }
|
|
|
+//
|
|
|
+// System.err.println(obj);
|
|
|
+//
|
|
|
+// BasicBSONObject bson2 = (BasicBSONObject) obj.get("o2");
|
|
|
+// Bson f = Filters.eq("_id", bson2.get("_id"));
|
|
|
+// BasicBSONObject set = (BasicBSONObject) bson.get("$set");
|
|
|
+// Document x = new Document("$set", set);
|
|
|
+// us.add(new UpdateOneModel<>(f, x));
|
|
|
+// mMap.put(ns, us);
|
|
|
+// Pair<Bson, Document> pair = new Pair<>(f, x);
|
|
|
+// updates.add(pair);
|
|
|
+// uMap.put(ns, updates);
|
|
|
+
|
|
|
+ } else if ("c".equals(op)) {
|
|
|
+ cIndex++;
|
|
|
+ System.err.println(obj);
|
|
|
+// MongoDatabase database = getDatabase4Ns(mongoClient, ns, dbs);
|
|
|
+ if (bson.get("commitIndexBuild") != null) {
|
|
|
+// MongoCollection<Document> coll = database.getCollection(bson.get("commitIndexBuild").toString());
|
|
|
+// BasicBSONList indexes = (BasicBSONList) bson.get("indexes");
|
|
|
+//
|
|
|
+// List<IndexModel> indexModels = new ArrayList<>();
|
|
|
+// //组合索引
|
|
|
+//
|
|
|
+// for (int i = 0; i < indexes.size(); i++) {
|
|
|
+// BasicDBObject keyObj = new BasicDBObject();
|
|
|
+// BasicBSONObject index = (BasicBSONObject) indexes.get(i);
|
|
|
+// BasicBSONObject keys = (BasicBSONObject) index.get("key");
|
|
|
+// for (String s : keys.keySet()) {
|
|
|
+// keyObj.put(s, keys.get(s));
|
|
|
+// }
|
|
|
+//
|
|
|
+// //添加配置
|
|
|
+// IndexOptions indexOptions = new IndexOptions();
|
|
|
+// if (index.get("unique") != null) {
|
|
|
+// indexOptions.unique(index.getBoolean("unique"));
|
|
|
+// }
|
|
|
+// if (index.get("background") != null) {
|
|
|
+// indexOptions.background(index.getBoolean("background"));
|
|
|
+// }
|
|
|
+// //索引名称
|
|
|
+// indexOptions.name(index.get("name").toString());
|
|
|
+// indexModels.add(new IndexModel(keyObj, indexOptions));
|
|
|
+// }
|
|
|
+// coll.createIndexes(indexModels);
|
|
|
+ } else if (bson.get("createIndexes") != null) {
|
|
|
+// MongoCollection<Document> coll = database.getCollection(bson.get("createIndexes").toString());
|
|
|
+//
|
|
|
+// List<IndexModel> indexModels = new ArrayList<>();
|
|
|
+// //组合索引
|
|
|
+//
|
|
|
+// BasicDBObject keyObj = new BasicDBObject();
|
|
|
+// BasicBSONObject keys = (BasicBSONObject) bson.get("key");
|
|
|
+// for (String s : keys.keySet()) {
|
|
|
+// keyObj.put(s, keys.get(s));
|
|
|
+// }
|
|
|
+//
|
|
|
+// //添加配置
|
|
|
+// IndexOptions indexOptions = new IndexOptions();
|
|
|
+// if (bson.get("unique") != null) {
|
|
|
+// indexOptions.unique(bson.getBoolean("unique"));
|
|
|
+// }
|
|
|
+// if (bson.get("background") != null) {
|
|
|
+// indexOptions.background(bson.getBoolean("background"));
|
|
|
+// }
|
|
|
+// //索引名称
|
|
|
+// indexOptions.name(bson.get("name").toString());
|
|
|
+// indexModels.add(new IndexModel(keyObj, indexOptions));
|
|
|
+// coll.createIndexes(indexModels);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ records++;
|
|
|
+ }
|
|
|
+ System.err.printf("新增:%s\t更新:%s\t索引:%s", iIndex, uIndex, cIndex);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|