在集合对象中的对象中添加数组会删除该对象中的所有其他数组。
考虑事件集合的成员:
{
"_id" : "EfEq7niEyLLatb7fb",
"attendeeFavorites" : {
"mRRYzNBaFEmuqCrLi" : [ ],
"jbm8BJJ3PJCyWRJwz" : [ ],
"9Ze5M6CkHdLwkJdbu" : [ ],
"bH5q4himZawTTrbyc" : [ ]
}
}
attendeeFavorites
的密钥是userIds。当该用户登录时,他们可以将字符串添加到其对应的阵列。这是活动代码:
$meteor.autorun($scope, function () {
var event = $scope.$meteorObject(Events, {}).subscribe('events');
if( event.attendeeFavorites && event.attendeeFavorites[Meteor.userId()] ) {
$scope.favorites = event.attendeeFavorites[Meteor.userId()];
}
});
$scope.addFavorite = function(){
$scope.favorites.push("x");
};
和发布功能:
Meteor.publish('events', function(){
var projection = {
name: 1
};
projection["attendeeFavorites."+this.userId] = 1;
return Events.find({},{fields: projection});
});
例如,当用户9Ze5M6CkHdLwkJdbu
调用addFavorite()
时,会向x
数组添加attendeeFavorites
,但会删除所有其他条目。这将上述内容变为:
{
"_id" : "EfEq7niEyLLatb7fb",
"attendeeFavorites" : {
"9Ze5M6CkHdLwkJdbu" : [
"x"
]
}
}
为什么会这样?
*编辑* 将发布功能重新编写为
Meteor.publish('events', function(){
return Events.find({});
});
修复了它,但这不是一个真正的解决方案,因为我不希望用户能够查看其他用户的收藏夹数组。
答案 0 :(得分:0)
创建特定于用户的订阅:
Meteor.publish('user_favorites').then(function() {
return Events.find({attendeeFavorites: this.userId})
});
这将仅返回该与会者的收藏
然后当你订阅它时:
$scope.favorites = $scope.$meteorCollection(Events).subscribe('user_favorites');
但是,如果您阅读angular-meteor文档,最好使用$ scope。$ meteorSubscribe:
$scope.$meteorSubscribe('user_favorites', function() {
$scope.$meteorCollection(Events, false); // false will prevent it from updating the db automatically. remove if you do want it to update
});
$ scope。$ meteorSubscribe将在范围被销毁时自动终止订阅。
请记住,我几乎睡着了,如果这不满足,那么我会在早上解决它:)
编辑 - 我错过了你想要做的事情,所以试试这个:
在偶数收藏中,您可以按ID列出与会者列表:
{
attendees: ['afasd89as8d923', 'q23rqwasdfj23', '..']
}
然后,每个用户都可以包含一组有关联收藏的有人参与的活动:
[
{eventId: 'asdfasdf22q39f8', favorites: ['1', '2', '3']},
{eventId: 'as2234assdf8989', favorites: ['asdf', 'foo', '3']}
]
你如何为我的收藏品建模我不知道但是没关系。每当用户访问页面时,他/她已经可以访问他们自己的收藏夹,那么您只需显示与该事件相关联的收藏夹。当然,如果您每个活动都有不同的收藏。
实际上,您不需要在每个活动中保留一份与会者名单,但这可能会为其他目的派上用场。