我正在为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
字段对于索引来说是一个很好的字段,并且在集合中应该是唯一的。
答案 0 :(得分:0)
在索引上设置unique
选项以使MongoDb强制执行唯一性:
items.ensureIndex(index, new BasicDBObject("unique", true));
请注意,您需要手动删除现有索引并删除所有重复项,否则您将无法创建唯一索引。
答案 1 :(得分: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上使用索引并不像听起来那么容易。您还可以在Mongo Indexing Tutorials和Mongo Index Concepts查看MongoDB文档以获取更多详细信息。一旦您需要一个在此处Why Direction order matter得到充分解释的组合索引,方向顺序可能非常重要。