Meteor MongoDB - 无法在API调用中使用_id插入_id

时间:2014-09-30 05:15:29

标签: mongodb meteor twitch

我正在尝试调用TwitchAPI并将一些返回的数据插入MongoDB。但是,每次出现此错误时:Error: Meteor requires document _id fields to be non-empty strings or ObjectIDs

单个流/频道的Twitch 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 simple定义要调用的url并设置一些变量。正如您所看到的,我是控制台记录了预期的_id所以我知道它返回了一个有效的字符串,但我仍然收到错误。目前,当我拨打电话时,我一次返回100个流并迭代它们以保存上面的4个字段。理想情况下,我想将每个流对象保存为数据库中的自己的条目但是我所做的所有尝试都导致了相同的错误,我还读到了与Meteor捆绑在一起的“miniMongo”上的版本不支持插入批量对象数组...我也读过miniMong不支持Collection.save(),所以很遗憾我认为用更新的API调用信息来更新每个_id的内容会更晚一些只能使用.save更新并插入同一语句中。

我不确定它是否有任何影响,但我在创建集合时尝试将autoIndexId设置为false,这似乎并不重要:

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

感谢任何见解。

1 个答案:

答案 0 :(得分:2)

问题是抽搐_id不是String,它似乎是Number(我可以通过你的JSON输出来判断:数字不是被_id包围的引号)。

我要做的是让Meteor生成自己的内部Mongo ID并将抽搐Streams.insert({ twitchId: item._id, title: item.channel.status, author: item.channel.display_name, url: item.url }); 存储为单独的属性。

twitchId

您必须按_id而不是{{1}}检索流,但这不是问题,对吗?