データとユーザーの2つのコレクションがあります。データ収集には、約300〜800人のユーザーからなるユーザーIDの配列があります。Meteor:MongoDB Joinのビッグデータのスピードアップ?
データコレクション内の各行について、すべてのユーザーの国に参加する必要があります。これは、あまりにも多くのデータが一度にクエリされるため、Webブラウザがハングアップします。
私は、Dataコレクションの約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.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;
}
});
収集データ:
プレプロのオプションがあります
出版:サーバー方法テスト済み
Meteor.publish("glyphInfo", function (courseId) {
this.unblock();
var query = {};
if (courseId) query.courseId = courseId;
return [GlyphInfo.find(query), UserInfo.find({})];
})
私のコレクションを退治して、すでに国が含まれているようにしていますが、これらのコレクションを変更することはできません。私は、このJOINをサーバーの起動時に実行し、その後Meteorメソッドとして配列を介して公開すると、サーバーの起動時間が長くなりすぎる可能性があると推測します。私は確信していませんが。
誰でもこのクエリをスピードアップする方法はありますか?
EDIT: MongoDB集約コマンドも試しましたが、Meteorのミニゴンでは非常に遅いようです。ネイティブ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}}
])
文書をテキストでダンプする..... – profesor79
私が取り組んでいるプロジェクトのテキストで文書を操作することはできません。 – Dranithix
集約は、minimongoに対して実行されず、サーバー側のみを実行します。 –