0

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

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

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..");
            }
        }

但正如我之前提到的,通常有相同的推文,并且它们在数据库中具有重复项。我认为该tweet_ID字段是索引的好字段,并且在集合中应该是唯一的。

4

2 回答 2

0

这个问题已经得到解答,但我想贡献一点,因为MongoDB API 2.11提供了一种接收唯一选项作为参数的方法:

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 文档以获取更多详细信息Mongo Indexing TutorialsMongo Index Concepts。一旦您需要一个组合索引,理解方向顺序可能非常重要,这里很好地解释了为什么方向顺序很重要

于 2014-01-22T09:49:32.187 回答
0

在您的索引上设置unique选项以让 MongoDb 强制执行唯一性:

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

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

于 2013-10-12T18:37:22.480 回答