2014-09-30 81 views
1

我想調用TwitchAPI並將一些返回的數據插入到MongoDB中。但是,每次出現此錯誤時:Error: Meteor requires document _id fields to be non-empty strings or ObjectIDsMeteor MongoDB - 不能從API調用插入_id與_id

針對單個流/信道

抽搐API響應看起來像這樣:

{ 
    "streams": [ 
    { 
     "_id": 11220687552, 
     "game": "League of Legends", 
     "viewers": 11661, 
     "created_at": "2014-09-30T01:10:36Z", 
     "_links": { 
     "self": "http://api.twitch.tv/kraken/streams/mushisgosu" 
     }, 
     "preview": { 
     "small": "http://static-cdn.jtvnw.net/previews-ttv/live_user_mushisgosu-80x50.jpg", 
     "medium": "http://static-cdn.jtvnw.net/previews-ttv/live_user_mushisgosu-320x200.jpg", 
     "large": "http://static-cdn.jtvnw.net/previews-ttv/live_user_mushisgosu-640x400.jpg", 
     "template": "http://static-cdn.jtvnw.net/previews-ttv/live_user_mushisgosu-{width}x{height}.jpg" 
     }, 
     "channel": { 
     "_links": { 
      "self": "https://api.twitch.tv/kraken/channels/mushisgosu", 
      "follows": "https://api.twitch.tv/kraken/channels/mushisgosu/follows", 
      "commercial": "https://api.twitch.tv/kraken/channels/mushisgosu/commercial", 
      "stream_key": "https://api.twitch.tv/kraken/channels/mushisgosu/stream_key", 
      "chat": "https://api.twitch.tv/kraken/chat/mushisgosu", 
      "features": "https://api.twitch.tv/kraken/channels/mushisgosu/features", 
      "subscriptions": "https://api.twitch.tv/kraken/channels/mushisgosu/subscriptions", 
      "editors": "https://api.twitch.tv/kraken/channels/mushisgosu/editors", 
      "videos": "https://api.twitch.tv/kraken/channels/mushisgosu/videos", 
      "teams": "https://api.twitch.tv/kraken/channels/mushisgosu/teams" 
     }, 
     "background": null, 
     "banner": "http://static-cdn.jtvnw.net/jtv_user_pictures/mushisgosu-channel_header_image-c5c08cce281b7be3-640x125.jpeg", 
     "display_name": "MushIsGosu", 
     "game": "League of Legends", 
     "logo": "http://static-cdn.jtvnw.net/jtv_user_pictures/mushisgosu-profile_image-b1c8bb5fd700025e-300x300.png", 
     "mature": false, 
     "status": "CLG hi im Gosu - Challenger AD - Smurfing Master!", 
     "partner": true, 
     "url": "http://www.twitch.tv/mushisgosu", 
     "video_banner": "http://static-cdn.jtvnw.net/jtv_user_pictures/mushisgosu-channel_offline_image-7e3401b20cb5d739-640x360.png", 
     "_id": 41939266, 
     "name": "mushisgosu", 
     "created_at": "2013-03-31T21:12:14Z", 
     "updated_at": "2014-09-30T03:08:55Z", 
     "abuse_reported": null, 
     "delay": 60, 
     "followers": 318914, 
     "profile_banner": null, 
     "profile_banner_background_color": null, 
     "views": 25963780, 
     "language": "en-us" 
     } 
    } 
    ], 
    "_total": 8477, 
    "_links": { 
    "self": "https://api.twitch.tv/kraken/streams?limit=1&offset=0", 
    "next": "https://api.twitch.tv/kraken/streams?limit=1&offset=1", 
    "featured": "https://api.twitch.tv/kraken/streams/featured", 
    "summary": "https://api.twitch.tv/kraken/streams/summary", 
    "followed": "https://api.twitch.tv/kraken/streams/followed" 
    } 
} 

我的服務器的方法的,試圖插入數據

  Meteor.call('getStreams', function(err, res) { 
       var data = res.data.streams; 
       console.log(data); 
       data.forEach(function(item) { 
        console.log(item._id); 
        Streams.insert({ 
         _id: item._id, 
         title: item.channel.status, 
         author: item.channel.display_name, 
         url: item.url 
        }); 
       }); 
      }); 

getStreams簡單的部分定義鏈接直接調用並設置一些變量。正如你可以看到我的控制檯日誌記錄預期_id所以我知道它正在返回一個有效的字符串,但我仍然收到錯誤。目前,當我撥打電話時,我一次返回100個流,並遍歷它們以保存上面的4個字段。理想情況下,我想將每個流對象保存爲數據庫中的自己的條目,但是我所有的嘗試都導致了相同的錯誤,並且我還在某處讀到與Meteor捆綁的「miniMongo」版本不支持插入散列中的對象數組...我也讀過,miniMong不支持Collection.save(),所以我認爲隨着最新的API調用信息更新每個_id的內容會更晚,因爲我不能使用.save來更新和插入在同一聲明中。

我不知道,如果有任何的影響,但我曾嘗試創建集合時設置autoIndexIdfalse,它似乎並沒有問題:

Streams = new Meteor.Collection('streams', {autoIndexId: false});

任何有識之士的讚賞。

+0

你最終是否讓你的網站公開? :D不知道它是什麼,但我很想看看它 – 2015-10-02 13:01:07

回答

2

問題是,抽搐_id不是String,它似乎是一個Number(我可以告訴您的JSON的輸出:數字不包含引號)。

我會做的就是讓流星生成自己的內部Mongo ID,並將抽搐_id作爲一個單獨的屬性來代替。

Streams.insert({ 
    twitchId: item._id, 
    title: item.channel.status, 
    author: item.channel.display_name, 
    url: item.url 
}); 

你將不得不檢索由twitchId代替_id流,但它幾乎沒有一個問題吧?

+0

由於miniMongo已經不支持'.save()'我需要編寫一個函數來檢查twitchId是否存在並更新它,但是在如果'.save()'被支持,未來是否會有另一種方法將twitch的'_id'與mongos匹配?在保存之前,我嘗試過'toString()'_id',但是現在它拋出了一個重複的鍵錯誤。可能只需要做更多的麻煩拍攝,但這是正確的方法嗎? – tehaaron 2014-09-30 05:36:19

+0

我不知道爲什麼twitch'_id'和你的集合'_id'之間的確切映射是一個問題?如果確實如此,你有沒有考慮過使用'upsert'作爲'save'解決方法? – saimeunt 2014-09-30 06:10:43

+0

我想到的唯一原因是能夠執行'Streams.insert(item)'來保存每個流對象的全部內容,而無需明確地調用各個屬性。有可能是一個更好的解決方案,但我是MongoDB的新手,並且仍然試圖圍繞數據庫結構,因爲我習慣於普通的sql樣式數據庫。 – tehaaron 2014-09-30 06:55:17