MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment concevoir un schéma MongoDB pour un agrégateur d'articles Twitter

deux conseils généraux :1.) n'ayez pas peur de dupliquer. C'est souvent une bonne idée de stocker les mêmes données différemment formatées dans différentes collections.

2.) si vous voulez trier et résumer des choses, il est utile de garder des champs de comptage partout. La méthode de mise à jour atomique de mongodb, associée aux commandes upsert, facilite le comptage et l'ajout de champs aux documents existants.

Ce qui suit est très certainement imparfait car il est tapé du haut de ma tête. Mais mieux vaut de mauvais exemples que pas d'exemples je pensais ;)

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
   }
}

ajouter un nouveau tweet :

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);

Obtenir les dix meilleurs liens triés par nombre de tweets qu'ils ont ?

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

Obtenir le lien le plus tweeté pour une date précise ?

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

Obtenir les tweets pour un lien ?

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

Recevez les dix derniers tweets ?

db.x.tweets.find().sort({'timeTweeted': -1}, -1).limit(10);