如何仅查找集合中具有一组ID的最新文档
How to find only newest document in collection with set of IDs
我有一个集合Feeds
和一个集合FeedElements
。FeedElements
文档通过feedId
字段引用Feeds
集合。此外,所有FeedElements
文档都具有日期字段submitted
。
我只想发布最新的(由字段submitted
确定)FeedElements
文档,它恰好对应于一个Feeds
文档。
以下是我尝试过的:
Meteor.publish('recentFeedElements', function (userId) {
var feedIds = Feeds.find({'userId': userId}).map(function(feed) {
return feed._id;
});
if (feedsIds.length > 0) return FeedElements.find({feedId: {$in: feedIds}}, {sort: {submitted: -1});
else this.ready();
});
问题是,如果我在FeedElements.find()
查询中结合使用limit
和sort
,我只会得到所有Feed
文档中的最新文档。然而,我希望有一个严格的1-1关系。因此,一个Feed
文档->具有适当参考的最新FeedElements
文档。
如果我理解得对,您希望每个提要都有lastActivity
字段,该字段包含该提要最后提交的提要元素的时间戳。您希望此字段是被动的,并且不希望发布所有提要元素。
在这种情况下,聚合不是一个解决方案,因为Meteor不允许反应聚合。
您需要使用低级发布API:http://docs.meteor.com/#/full/meteor_publish(参见示例部分)。
低级发布API(this.added
/this.removed
/this.changed
/others)使您能够完全控制通过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回购https://github.com/imkost/feeds.只有git clone
和meteor run
。
您可以通过$sort、$group&第一
db.FeedElements.aggregate(
[
{ $match: { feedId: {$in:[1,2,3]}} },
{ $sort: { submitted: -1} },
{
$group:
{
_id: "$feedId",
firstFeedElement: {$first : "$$ROOT"} // Get first whole document or you can take fields you want
}
}
]
)
相关文章:
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- difference between '$(<%= DDL.ID %>) & $('
- 使用Javascript获取所选选项ID
- 根据id将json数组组合为一个json数组
- 是否有一个JS/jQuery函数可以获取某个类的每个元素的ID
- jQuery-2.1.1.min.js或最新版本jQuery-2.13.min.js不会't支持'@
- 对id以某个字符串开头的元素进行计数
- addData()从最新图表中删除.js 2.1.3-怎么了
- 如果元素's的ID以数字开头
- 通过id和class属性获取元素
- 根据选项卡内部的文本链接中的哈希ID动态选择jqueryUI选项卡
- 使用当前日期生成随机id
- Javascript-ID冲突的几率
- 为什么jQuery 1.8不能在IE8和InternetExplorer9中使用?(截至2012年9月的IE9最新版本)
- Href:当前DIV中的目标ID
- 无法获取属性'Id'使用Knockout.js的未定义或空引用API
- 如何仅查找集合中具有一组ID的最新文档
- 找到在传单中创建的最新图层的传单id
- 如何按id's值从最新到最老排序JSON
- 获取具有相同ID的多个文本框的特定变量上的最新文本框的值