Как разработать схему MongoDB для агрегатора статей в Твиттере - PullRequest
3 голосов
/ 30 июля 2011

Я новичок в MongoDB и в качестве упражнения создаю приложение, которое извлекает ссылки из твитов. Идея состоит в том, чтобы получить самые твитнутые статьи по теме. Мне было трудно разработать схему для этого приложения.

  • Приложение собирает твиты и сохраняет их
  • Твиты разбираются на ссылки
  • Ссылки сохраняются с дополнительной информацией (заголовок, выдержка и т. Д.)
  • Твит может содержать более одной ссылки
  • Ссылка может иметь много твитов

Как мне:

  • Сохранить эти коллекции, встроенный документ?
  • Получить первые десять ссылок, отсортированных по количеству твитов, которые у них есть?
  • Получить самую твиттированную ссылку на конкретную дату?
  • Получить твиты по ссылке?
  • Получить десять последних твитов?

Я бы хотел получить некоторую информацию по этому вопросу.

1 Ответ

3 голосов
/ 30 июля 2011

два общих совета: 1.) не бойтесь дублировать. Часто бывает полезно хранить одни и те же данные, по-разному отформатированные в разных коллекциях.

2.) Если вы хотите сортировать и суммировать данные, это помогает вести подсчет полей повсюду. Метод атомарного обновления mongodb вместе с командами upsert упрощает подсчет и добавление полей в существующие документы.

Следующее, безусловно, ошибочно, потому что оно набрано с моей головы. Но лучше плохие примеры, чем никаких примеров, я думал;)

colletion tweets:

{
  tweetid: 123,
  timeTweeted: 123123234,  //exact time in milliseconds
  dayInMillis: 123412343,  //the day of the tweet kl 00:00:00
  text: 'a tweet with a http://lin.k and an http://u.rl',
  links: [
     'http://lin.k',
     'http://u.rl' 
  ],
  linkCount: 2
}

collection links: 

{
   url: 'http://lin.k'
   totalCount: 17,
   daycounts: {
      1232345543354: 5, //key: the day of the tweet kl 00:00:00
      1234123423442: 2,
      1234354534535: 10
   }
}

добавить новый твит:

db.x.tweets.insert({...}) //simply insert new document with all fields

//for each found link:
var upsert = true;
var toFind =  { url: '...'};
var updateObj = {'$inc': {'totalCount': 1, 'daycounts.12342342': 1 } }; //12342342 is the day of the tweet
db.x.links.update(toFind, updateObj, upsert);

Получить первые десять ссылок, отсортированных по количеству твитов, которые у них есть?

db.x.links.find().sort({'totalCount:-1'}).limit(10);

Получить самую твиттированную ссылку на конкретную дату?

db.x.links.find({'$gt':{'daycount.123413453':0}}).sort({'daycount.123413453':-1}).limit(1); //123413453 is the day you're after

Получить твиты по ссылке?

db.x.tweets.find({'links': 'http://lin.k'});

Получить десять последних твитов?

db.x.tweets.find().sort({'timeTweeted': -1}, -1).limit(10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...