2016-07-12 1 views
1

데이터 및 사용자라는 두 가지 컬렉션이 있습니다. 데이터 수집에는 약 300 ~ 800 명의 사용자로 구성된 사용자 ID의 배열이 있습니다.유성 : Big Data에 대한 MongoDB Join의 속도가 빨라 집니까?

데이터 컬렉션의 각 행에 대해 모든 사용자의 국가에 가입해야합니다. 너무 많은 데이터가 한 번에 쿼리되기 때문에 웹 브라우저가 중단됩니다.

Data Collection의 약 16 행을 한 번에 쿼리하고 지금까지 Users 컬렉션에 18833 명의 사용자가 있습니다.

지금까지 저는 Meteor 메소드와 Meteor 컬렉션에 대한 transform() JOIN을 모두 만들려고했습니다. 이는 내 앱을 걸고있는 것입니다.

몽고 컬렉션 :

UserInfo = new Mongo.Collection("userInfo") 
GlyphInfo = new Mongo.Collection("GlyphAllinOne", { 
    transform: function(doc) { 
     doc.peopleInfo = doc.peopleInfo.forEach(function(person) { 
      person.code3 = UserInfo.findOne({userId: person.name}).code3; 
      return person; 
     }) 
     return doc; 
    } 
}); 

'CODE3는'사용자의 국가를 지정합니다.

출판 :

Meteor.publish("glyphInfo", function (courseId) { 
    this.unblock(); 
    var query = {}; 
    if (courseId) query.courseId = courseId; 
    return [GlyphInfo.find(query), UserInfo.find({})]; 
}) 

테스트 서버 방법 :

Meteor.methods({ 
    'glyph.countryDistribution': function(courseId) { 
     var query = {}; 
     if (courseId) query.courseId = courseId; 
     var glyphs = _.map(_.pluck(GlyphInfo.find(query).fetch(), 'peopleInfo'), function(glyph) { 
      _.map(glyph, function(user) { 
       var data = Users.findOne({userId: user.name}); 
       if (data) { 
        user.country = data ? data.code3 : null; 
        console.log(user.country) 
        return user; 
       } 
      }); 
      return glyph; 
     }); 
     return glyphs; 
    } 
}); 

컬렉션 데이터 :

GlyphAllInOne Collection userInfo Collection

은 prepro의 옵션이 있습니다 내 컬렉션을 종결하여 국가가 이미 포함되어 있지만 컬렉션을 수정할 수는 없습니다. 나는이 JOIN을 서버 시작시에 수행하고 그 후에 Meteor 메소드가 배열을 통해 노출되면 서버의 시작 시간을 너무 오래 지연시킬 수 있다고 추정한다. 나는 잘 모르겠지만.

누구든지이 쿼리의 속도를 높이는 방법에 대한 아이디어가 있습니까?

EDIT : MongoDB 집계 명령도 시도했는데 Meteor의 minimongo에서는 매우 느립니다. 네이티브 MongoDB 클라이언트에서 1 초와 비교하여 쿼리하는 데 4 분이 걸렸습니다.

서버에서
var codes = GlyphInfo.aggregate([ 

     {$unwind: "$peopleInfo"}, 
     {$lookup: { 
      from: "users", 
      localField: "peopleInfo.name", 
      foreignField: "userId", 
      as: "details" 
     } 
     }, 
     {$unwind: "$details"}, 
     {$project: {"peopleInfo.Count": 1, "details.code3": 1}} 
    ]) 
사용하여 나는 약간 다르게이 문제를 접근 할
+0

문서를 텍스트로 덤프하십시오 ..... – profesor79

+0

나는 작업중인 텍스트의 문서로 작업 할 수 없습니다. – Dranithix

+0

집계가 minimongo에 대해 실행되지 않으며 서버 측만 실행됩니다. –

답변

0

해결 데이터베이스에 지연되는 색인 고유의 열을 해결하는 가장 큰 요인으로, 거대한 MongoDB를 집계 호출을 생성하여 문제.

4 백만개가 넘는 항목으로 데이터베이스에 신중하게 색인을 구현 한 후 Robomongo에서 0.3 초, 1에서 0.3 초가 걸렸습니다.Meteor에서 클라이언트로 데이터를 보내는 4 초/여기

는 그것을보고 싶은 사람들을 위해 집계 코드 : 다른 사람이 비슷한 문제를 다루는된다

Meteor.methods({ 
    'course.countryDistribution': function (courseId, videoId) { 
     var query = {}; 
     if (courseId) query.courseId = courseId; 

     var data = GlyphInfo.aggregate([ 

      {$unwind: "$peopleInfo"}, 
      {$lookup: { 
       from: "users", 
       localField: "peopleInfo.name", 
       foreignField: "userId", 
       as: "details" 
      } 
      }, 
      {$unwind: "$details"}, 
      {$project: {"peopleInfo.Count": 1, "details.code3": 1}}, 
      {$group: {_id: "$details.code3", count: {$sum: "$peopleInfo.Count"}}} 
     ]) 

     return data; 
    } 
}); 

경우, 저에게 연락 주시기 바랍니다. 여러분의 성원에 감사드립니다!

0

, reywood:publish-composite

  1. 나는 게시 복합 사용하여 glyphinfo를 게시하고 게시의 관련 사용자 및 해당 국가 필드를 포함 할
  2. glyphinfo 개체와 함께 국가 이름을 표시해야 할 때마다 클라이언트에서 국가에 가입하십시오.

출판 :

Meteor.publishComposite('glyphInfo', function(courseId) { 
    this.unblock(); 
    return { 
     find: function() { 
     var query = {}; 
     if (courseId) query.courseId = courseId; 
     return GlyphInfo.find(query); 
     }, 
     children: [ 
      { 
       find: function(glyph) { 
        var nameArray = []; 
        glyph.person.forEach(function(person){ 
         nameArray.push(person.name); 
        }; 
        return UserInfo.find({ userId: {$in: nameArray }}); 
      } 
     ] 
    } 
}); 
+0

# 1에 대한 게시를 성공적으로 만들었지 만 # 2는 너무 많은 처리를 필요로하여 너무 많은 UserInfo.findOne()을 호출하여 브라우저를 정지 시켰습니다. 저는 peopleInfo의 국가 분포를 얻으려고 노력하고 있습니다. 그래서 PeopleInfo를 기반으로 한 배열로서 각 국가마다 Count의 수를 알고 있습니다. – Dranithix

+1

아마도 # 2는 서버에서 mongo-aggregation으로 남겨 두는 것이 가장 좋습니다. –