2014-09-30 3 views
1

TwitchAPI를 호출하고 반환 된 데이터 일부를 MongoDB에 삽입하려고합니다. 그러나이 오류가 발생할 때마다 : Error: Meteor requires document _id fields to be non-empty strings or ObjectIDs.Meteor 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 간단한 데이터를 삽입하려고 내 서버 방식의 일부가 URL을 정의 호출하고 일부 변수를 설정합니다. 당신이 볼 수 있듯이 나는 _id을 로깅하는 콘솔이므로 유효한 문자열을 반환한다는 것을 알았지 만 여전히 오류가 발생하고 있습니다. 현재 전화를 걸면 한 번에 100 개의 스트림을 반환하고 위에있는 4 개의 필드를 저장하기 위해 반복합니다. 이상적으로, 나는 각 스트림 객체를 DB에 자신의 엔트리로 저장하고 싶지만, 그렇게하려는 나의 모든 시도는 똑같은 오류를 낳았고, 또한 "miniMongo"의 버전이 Meteor에 번들되어 있으면 대량의 객체 배열 ... 나는 또한 그 smallMong이 Collection.save()을 지원하지 않는다는 것을 읽었습니다. 슬프게도 최신 API 호출 정보로 각 _id의 내용을 업데이트하는 데 더 늦을 것 같아요. 왜냐하면 그냥 사용하지 않기 때문에 .save을 업데이트하고 삽입해야합니다. 같은 진술에서. 그것이 어떤 영향을하지만 컬렉션을 만들 때 falseautoIndexId을 설정하려고 않은 경우

나는 확실하지 오전 중요하지 않는 것 :

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

어떤 통찰력에 감사드립니다.

+0

결국 웹 사이트가 공개 되었습니까? : D 모르겠다. 그렇지만 체크 아웃하고 싶다. –

답변

2

_idString이 아니며, Number 인 것으로 보입니다 (JSON의 출력으로 알 수 있습니다. 숫자는 따옴표로 묶이지 않음).

내가 할 수있는 것은 Meteor가 내부 Mongo ID를 생성하고 트렁크 _id을 별도의 속성으로 저장하도록하는 것입니다.

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

대신 _idtwitchId로 스트림을 검색해야하지만 그것은 바로, 거의 문제가 없다?

+0

miniMongo는 이미'.save()'를 지원하지 않기 때문에 당분간은 twitchId가 있는지 확인하고 업데이트 할 수있는 함수를 작성해야한다. '.save()'가 지원된다면 앞으로 트 위치의'_id'와 몽고를 매치하는 또 다른 방법이있을 것인가? 저장하기 전에'_id'를 toString()하려고했지만 이제는 중복 키 오류가 발생합니다. 좀 더 문제를 해결하는 데 도움이 될지도 모르지만 이것이 올바른 접근 방법입니까? – tehaaron

+0

트 위치'_id'와 컬렉션'_id' 사이의 정확한 매핑이 중요한 이유를 이해하지 못하겠습니까? 정말로 그렇다면'upsert'를'save' 해결 방법으로 사용하는 것을 고려해 보셨습니까? – saimeunt

+0

내가 염두에 두었던 유일한 이유는 개별 속성을 명시 적으로 호출하지 않고 각 스트림 객체의 전체를 저장하기 위해'Streams.insert (item) '을 수행 할 수 있다는 것이 었습니다. 아마도 더 나은 해결책이 있을지 모르지만 나는 MongoDB를 처음 사용하고 있으며 일반적인 SQL 스타일 DB에 익숙해 진 이후로 DB 구조에 대한 내 마음을 감쌀려고 노력하고 있습니다. – tehaaron