我想创建一个recentlyVisited
列表,这是一个限制为三个项目的列表。比前三个更早的结果将被“推离”列表的边缘(并且完全不相关,因此可以删除)。
对于起始数据类型,请说我有类似的东西。
{
"username": "corvid",
"recentlyVisited": ['1234', '5678', '1470']
}
然后,在提交此问题时,我可能会执行以下操作
Template.question.onCreated(function() {
var questionId = Router.current().params._id;
Meteor.users.update(Meteor.userId(), {
$push: { "recentlyVisited": questionId }
});
});
我可以像这样发布它,但它仍然无法解决核心问题。
Meteor.publish('currentUser', function() {
if(this.userId) {
return Meteor.users.find(
{ _id: this.userId },
{ limit: { recentlyVisited: 3 } }
);
}
});
是否可以$push
但是可以限制集合中可以维护的数量?
答案 0 :(得分:1)
看起来您需要$slice
运算符。
Meteor.users.update(Meteor.userId(), {
$push: {
recentlyVisited: {
$each: [ questionId ],
$position: 0,
$slice: 3
}
}
});
http://docs.mongodb.org/manual/reference/operator/update/slice/
答案 1 :(得分:1)
是否可以$ push但限制可维持的数量 设置?是
请使用$slice。
$ slice修饰符限制$ push期间的数组元素数 操作
另一个引用来自http://docs.mongodb.org/manual/reference/operator/projection/slice/
有关在更新期间限制数组大小的信息 $ push,请参阅$ slice修饰符
所以只需改变代码就好了。
Template.question.onCreated(function() {
var questionId = Router.current().params._id;
Meteor.users.update(Meteor.userId(),{$push:{
recentlyVisited:{
$each:[questionId ],
$slice:3
}
}});
});