MongoDB当中删除重复记录(Java)

数据库表描述:

     Table Name:NewsFromWeb

     Column Name 1:_id

     Column Name 2:url

     Column Name 3:title

     Other Columns ....

                              ....

     功能实现的前提:如果数据库表当中有相同的url,则认定是重复的记录.

     功能实现的思路:通过Group by一样的查询,找到有相同的记录,做出列表,并且把记录的第二条以后的数据,进行删除,只保留第一条的记录.

     从SQL实现上类似:select sum(url) as urlCount from NewsFromWeb group by url.

     如下是实现方法:

Java代码   收藏代码
  1. @Test  
  2.     public void checkRepeat(){  
  3.         //first group by key  
  4.         BasicDBObject key = new BasicDBObject();  
  5.         key.put("url"true);  
  6.         BasicDBObject initial = new BasicDBObject();  
  7.         initial.put("urlCount"0);  
  8.         BasicDBObject cond = new BasicDBObject();  
  9.         cond.put("url"1);  
  10.         String reduce = "function(obj,prev) { prev.urlCount++; }";  
  11.         DBObject objMap  = mongoDAO.getCollection().group(key, new BasicDBObject(), initial, reduce);  
  12.           
  13.         Set set = objMap.keySet();  
  14.         Iterator it = set.iterator();         
  15.         while(it.hasNext()){  
  16.           String str_key = (String) it.next();  
  17.           String recordStr = objMap.get(str_key).toString();  
  18.           DBObject doc = (DBObject) JSON.parse(recordStr);  
  19.           if (Double.valueOf(doc.get("urlCount").toString())>1){  
  20.               BasicDBObject condDel = new BasicDBObject();  
  21.                 cond.put("url", doc.get("url").toString());  
  22.                 DBCursor map  = mongoDAO.getCollection().find(cond);  
  23.                 int j=0;  
  24.                 while(map.hasNext()){  
  25.                     DBObject obj = map.next();  
  26.                     if (j>0){  
  27.                         System.out.println("正在删除:"+obj);  
  28.                         mongoDAO.getCollection().remove(obj);  
  29.                     }  
  30.                     j++;  
  31.                 }               
  32.           }  
  33.         }  
  34.     }  
 

     本人通过测试10万条数据处理大约2分钟左右,只是一个大概的数据,其实跟硬件和重复记录有很大关系,感觉速度还能接受(CPU老赛扬1.6,Window环境)

好的,下面是一个简单的Java连接MongoDB实现账单管理系统的示例代码。 首先需要引入MongoDBJava驱动包,可以通过Maven添加依赖: ```xml <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.12.7</version> </dependency> ``` 接着就可以编写Java程序连接MongoDB了: ```java import com.mongodb.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import org.bson.Document; import java.util.List; import java.util.Scanner; public class BillManagementSystem { private static final String DB_NAME = "bill_db"; private static final String COLLECTION_NAME = "bills"; private MongoClient mongoClient; private MongoCollection<Document> collection; public BillManagementSystem() { mongoClient = new MongoClient("localhost", 27017); MongoDatabase database = mongoClient.getDatabase(DB_NAME); collection = database.getCollection(COLLECTION_NAME); } public void addBill() { Scanner scanner = new Scanner(System.in); System.out.println("请输入账单名称:"); String name = scanner.nextLine(); System.out.println("请输入账单金额:"); double amount = scanner.nextDouble(); Document doc = new Document("name", name) .append("amount", amount); collection.insertOne(doc); System.out.println("添加成功!"); } public void deleteBill() { Scanner scanner = new Scanner(System.in); System.out.println("请输入要删除的账单名称:"); String name = scanner.nextLine(); collection.deleteOne(Filters.eq("name", name)); System.out.println("删除成功!"); } public void updateBill() { Scanner scanner = new Scanner(System.in); System.out.println("请输入要修改的账单名称:"); String name = scanner.nextLine(); System.out.println("请输入修改后的账单金额:"); double amount = scanner.nextDouble(); collection.updateOne(Filters.eq("name", name), new Document("$set", new Document("amount", amount))); System.out.println("修改成功!"); } public void searchBill() { Scanner scanner = new Scanner(System.in); System.out.println("请输入要查询的账单名称:"); String name = scanner.nextLine(); List<Document> results = collection.find(Filters.eq("name", name)).into(new ArrayList<>()); if (results.isEmpty()) { System.out.println("没有找到该账单记录!"); } else { for (Document doc : results) { System.out.println("账单名称:" + doc.getString("name") + ",账单金额:" + doc.getDouble("amount")); } } } public void close() { mongoClient.close(); } public static void main(String[] args) { BillManagementSystem system = new BillManagementSystem(); Scanner scanner = new Scanner(System.in); while (true) { System.out.println("请选择操作:\n1.添加账单\n2.删除账单\n3.修改账单\n4.查询账单\n5.退出"); int choice = scanner.nextInt(); switch (choice) { case 1: system.addBill(); break; case 2: system.deleteBill(); break; case 3: system.updateBill(); break; case 4: system.searchBill(); break; case 5: system.close(); System.exit(0); break; default: System.out.println("无效的操作!"); } } } } ``` 在上面的代码中,我们首先在构造函数中连接到MongoDB,并获得了一个账单集合的引用。然后实现了四个基本功能:添加账单、删除账单、修改账单和查询账单。最后在主函数中通过一个循环控制用户的操作,直到用户选择退出为止。 需要注意的是,这里没有进行任何的数据验证和处理,例如输入的金额是否合法、账单名称是否重复等等,这些处理应该根据具体的业务需求进行实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值