sql >> データベース >  >> NoSQL >> MongoDB

Twitterの記事アグリゲーター用にMongoDBスキーマを設計するにはどうすればよいですか

    2つの一般的なヒント: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);
    

    ツイート数でソートされた上位10のリンクを取得しますか?

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

    最新のツイートを10個入手しますか?

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



    1. マングースモデルupdate()とsave()

    2. MongoDB構成ファイルに環境変数を追加することは可能ですか?

    3. この場合、MongoDB*クライアント*がサーバーよりも多くのメモリを使用するのはなぜですか?

    4. 更新後のMongoDBフィールドの順序とドキュメントの位置の変更