私はあなたが右理解していれば、あなたはすべてのフィードがこのフィードの最後の提出給電素子のタイムスタンプが含まれているlastActivity
フィールドを持っていると思います。このフィールドを反応させ、すべてのフィード要素を公開しないようにします。
この場合、Meteorはリアクティブな集計を許可しないため、集計は解決策ではありません。
低レベルの公開API:http://docs.meteor.com/#/full/meteor_publish(例のセクションを参照)を使用する必要があります。
低レベルのAPIを公開(this.added
/this.removed
/this.changed
/その他)あなたがMeteor.publish
メソッドを介してクライアントに送るどのようなデータを完全に制御できます。ここで
は(私はES2015の構文を使用します)あなたはあなたの問題を解決することができる方法です。
// client/client.js
Meteor.subscribe('userFeeds', { userId: 1 });
// lib/lib.js
Feeds = new Mongo.Collection('feeds');
FeedElements = new Mongo.Collection('FeedElements');
// server/server.js
// When setting `submitted` field, automatically set `submittedAt` field
// (I use matb33:collection-hooks here)
FeedElements.before.update((userId, elem, fieldNames, modifier) => {
if (modifier.$set.submitted) {
modifier.$set.submittedAt = new Date();
}
});
function getLastActivity(feedId) {
const lastSubmittedElem = FeedElements.findOne(
{
feedId,
submitted: true,
},
{
sort: { submittedAt: -1 }
}
);
return lastSubmittedElem ? lastSubmittedElem.submittedAt : null;
}
Meteor.publish('userFeeds', function({ userId }) {
const elemsObservers = {};
// Observe all user feeds
var feedObserver = Feeds.find({ userId: userId }).observeChanges({
added: (feedId, fields) => {
// Observe feed elements of the feed
elemsObservers[feedId] = FeedElements.find({ feedId }).observeChanges({
changed: (elemId, fields) => {
// Update `lastActivity` field when new element is submitted
if (fields.submitted) {
this.changed('feeds', feedId, { lastActivity: fields.submittedAt });
}
},
});
fields.lastActivity = getLastActivity(feedId);
this.added('feeds', feedId, fields);
},
changed: (feedId, fields) => {
this.changed('feeds', feedId, fields);
},
removed: (feedId) => {
elemsObservers[feedId].stop();
delete elemsObservers[feedId];
this.removed('feeds', feedId);
},
});
this.ready();
this.onStop(function() {
feedObserver.stop();
for (const feedId in elemsObservers) {
elemsObservers[feedId].stop();
}
});
});
また、私はgithubのレポを準備しました。ちょうどgit clone
およびmeteor run
。
モデルを共有できますか? –
私があなたの意図を理解しているなら、あなたが望むのは、もちろん存在するならば、それぞれの "feedId"値の "最新の"ドキュメントでしょうか?ここで推測しておくべき明確なケースは、それぞれの「フィードID」に対して別々のクエリを提出し、その結果を単一のレスポンスに結合する方が良いということです。関連:[mongodb集約で各グループを制限してソートする](http://stackoverflow.com/questions/33458107/limit-and-sort-each-group-by-in-mongodb-using-aggregation/33458267#33458267) –
ご協力いただきありがとうございます!はい、まさに私が欲しいものです。 – user3475602