使用Java和JSON对象避免mongoDB中的重复条目

使用Java和JSON对象避免mongoDB中的重复条目,java,json,mongodb,twitter,Java,Json,Mongodb,Twitter,我正在开发一个分析Twitter数据的程序。 我现在正在使用mongoDB。我尝试编写一个Java程序,从Twitter API获取推文,并将其放入数据库。 获取tweet已经非常有效,但是当我想将它们放入数据库时,我遇到了一个问题。由于twitterapi通常只返回相同的tweet,因此我必须在数据库中放置某种索引 首先,我连接到数据库并获取与搜索词相关的集合,如果不存在,则创建此集合 public void connectdb(String keyword) {

我正在开发一个分析Twitter数据的程序。 我现在正在使用mongoDB。我尝试编写一个Java程序,从Twitter API获取推文,并将其放入数据库。 获取tweet已经非常有效,但是当我想将它们放入数据库时,我遇到了一个问题。由于twitterapi通常只返回相同的tweet,因此我必须在数据库中放置某种索引

首先,我连接到数据库并获取与搜索词相关的集合,如果不存在,则创建此集合

public void connectdb(String keyword)
        {
            try {
                // on constructor load initialize MongoDB and load collection
                initMongoDB();
                items = db.getCollection(keyword);
                BasicDBObject index = new BasicDBObject("tweet_ID", 1);
                items.ensureIndex(index);



            } catch (MongoException ex) {
                System.out.println("MongoException :" + ex.getMessage());
            }

        }
然后我获取推文并将其放入数据库:

public void getTweetByQuery(boolean loadRecords, String keyword) {

            if (cb != null) {
                TwitterFactory tf = new TwitterFactory(cb.build());
                Twitter twitter = tf.getInstance();
                try {
                    Query query = new Query(keyword);
                    query.setCount(50);
                    QueryResult result;
                    result = twitter.search(query);
                    System.out.println("Getting Tweets...");
                    List<Status> tweets = result.getTweets();

                    for (Status tweet : tweets) {

                        BasicDBObject basicObj = new BasicDBObject();
                        basicObj.put("user_name", tweet.getUser().getScreenName());
                        basicObj.put("retweet_count", tweet.getRetweetCount());
                        basicObj.put("tweet_followers_count", tweet.getUser().getFollowersCount());

                        UserMentionEntity[] mentioned = tweet.getUserMentionEntities();
                        basicObj.put("tweet_mentioned_count", mentioned.length);
                        basicObj.put("tweet_ID", tweet.getId());
                        basicObj.put("tweet_text", tweet.getText());


                        if (mentioned.length > 0) {
//                    System.out.println("Mentioned length " + mentioned.length + " Mentioned: " + mentioned[0].getName());
                        }
                        try {
                            items.insert(basicObj);
                        } catch (Exception e) {
                            System.out.println("MongoDB Connection Error : " + e.getMessage());
                            loadMenu();
                        }
                    }
                    // Printing fetched records from DB.
                    if (loadRecords) {
                        getTweetsRecords();
                    }

                } catch (TwitterException te) {
                    System.out.println("te.getErrorCode() " + te.getErrorCode());
                    System.out.println("te.getExceptionCode() " + te.getExceptionCode());
                    System.out.println("te.getStatusCode() " + te.getStatusCode());
                    if (te.getStatusCode() == 401) {
                        System.out.println("Twitter Error : \nAuthentication credentials (https://dev.twitter.com/pages/auth) were missing or incorrect.\nEnsure that you have set valid consumer key/secret, access token/secret, and the system clock is in sync.");
                    } else {
                        System.out.println("Twitter Error : " + te.getMessage());
                    }


                    loadMenu();
                }
            } else {
                System.out.println("MongoDB is not Connected! Please check mongoDB intance running..");
            }
        }
public void getWeetByQuery(布尔加载记录,字符串关键字){
如果(cb!=null){
TwitterFactory tf=新的TwitterFactory(cb.build());
Twitter=tf.getInstance();
试一试{
查询查询=新查询(关键字);
查询设置计数(50);
查询结果;
结果=twitter.search(查询);
System.out.println(“获取Tweets…”);
List tweets=result.getTweets();
用于(状态推文:推文){
BasicDBObject basicObj=新的BasicDBObject();
basicObj.put(“用户名”,tweet.getUser().getScreenName());
basicObj.put(“retweet_count”,tweet.getRetweetCount());
basicObj.put(“tweet\u followers\u count”,tweet.getUser().getFollowersCount());
UserNideEntity[]已提及=tweet.getUserNideEntities();
basicObj.put(“tweet_提到了_计数”,提到了.length);
basicObj.put(“tweet_ID”,tweet.getId());
basicObj.put(“tweet_text”,tweet.getText());
如果(长度>0){
//System.out.println(“提及的长度”+提及的长度+”:+提及的[0].getName());
}
试一试{
项目。插入(基本COBJ);
}捕获(例外e){
System.out.println(“MongoDB连接错误:+e.getMessage());
loadMenu();
}
}
//打印从数据库获取的记录。
如果(加载记录){
getTweetsRecords();
}
}捕获(twitter异常){
System.out.println(“te.getErrorCode()”+te.getErrorCode());
System.out.println(“te.getExceptionCode()”+te.getExceptionCode());
System.out.println(“te.getStatusCode()”+te.getStatusCode());
如果(te.getStatusCode()==401){
System.out.println(“Twitter错误:\n身份验证凭据(https://dev.twitter.com/pages/auth)丢失或不正确。\n请确保已设置有效的使用者密钥/密码、访问令牌/密码,并且系统时钟同步。“);
}否则{
System.out.println(“Twitter错误:+te.getMessage());
}
loadMenu();
}
}否则{
System.out.println(“MongoDB未连接!请检查MongoDB intance正在运行…”);
}
}
但正如我前面提到的,经常有相同的tweet,而且它们在数据库中有重复的tweet。 我认为
tweet\u ID
字段是索引的好字段,在集合中应该是唯一的。

在索引上设置选项,让MongoDb强制唯一性:

items.ensureIndex(index, new BasicDBObject("unique", true));

请注意,您需要手动删除现有索引并删除所有重复的索引,否则您将无法创建唯一索引。

这个问题已经得到了回答,但我想做一点贡献,因为提供了一种方法,可以接收唯一选项作为参数:

public void ensureIndex(DBObject keys, String name, boolean unique)
对于希望在MongoDBNote上存储json文档的人来说,有一点需要提醒的是,唯一性必须应用于BasicObject键,而不能超过值。例如:

BasicDBObject basicObj = new BasicDBObject();
basicObj.put("user_name", tweet.getUser().getScreenName());
basicObj.put("retweet_count", tweet.getRetweetCount());
basicObj.put("tweet_ID", tweet.getId());
basicObj.put("tweet_text", tweet.getText());
basicObj.put("a_json_text", "{"info_details":{"info_id":"1234"},"info_date":{"year":"2012"}, {"month":"12"}, {"day":"10"}}");
在这种情况下,只能为基本对象键创建唯一索引:

BasicDBObject index = new BasicDBObject();
int directionOrder = 1;
index.put("tweet_ID", directionOrder);
boolean isUnique = true;
items.ensureIndex(index, "unique_tweet_ID", isUnique);
任何关于JSON值的索引,比如“info_id”,都不会起作用,因为它不是BasicObject键

在MongDB上使用索引并不像听起来那么容易。您还可以查看MongoDB文档以了解更多详细信息。一旦您需要一个组合索引,那么理解方向顺序可能非常重要,这在这里得到了很好的解释

或者在传递的基本对象上添加(“dropDups”,true)。