兩個一般提示: 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);
獲得十大鏈接排序通過他們的tweets數量?
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);
當習慣了這種情況時,很難不規範化。你的例子非常有用,非常感謝你! :) – Sven