MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie entwerfe ich ein MongoDB-Schema für einen Twitter-Artikelaggregator?

Zwei allgemeine Tipps:1.) Haben Sie keine Angst vor Duplikaten. Es ist oft eine gute Idee, dieselben Daten unterschiedlich formatiert in verschiedenen Sammlungen zu speichern.

2.) Wenn Sie Sachen sortieren und zusammenfassen möchten, hilft es, überall Zählfelder zu behalten. Die atomare Aktualisierungsmethode von mongodb zusammen mit Upsert-Befehlen macht es einfach, Felder zu zählen und Felder zu bestehenden Dokumenten hinzuzufügen.

Das Folgende ist mit Sicherheit fehlerhaft, weil es von oben in meinem Kopf getippt wurde. Aber besser schlechte Beispiele als gar keine, dachte ich;)

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

neuen Tweet hinzufügen:

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

Die Top-Ten-Links sortiert nach der Anzahl ihrer Tweets abrufen?

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

Den am häufigsten getwitterten Link für ein bestimmtes Datum erhalten?

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

Holen Sie sich die Tweets für einen Link?

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

Die zehn neusten Tweets abrufen?

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