2014-09-30 51 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