2015-09-05 56 views
0

向集合对象中的对象添加数组会删除该对象中的所有其他数组。修改集合对象的属性将删除所有其他属性

考虑事件集合的成员:

{ 
     "_id" : "EfEq7niEyLLatb7fb", 
     "attendeeFavorites" : { 
       "mRRYzNBaFEmuqCrLi" : [ ], 
       "jbm8BJJ3PJCyWRJwz" : [ ], 
       "9Ze5M6CkHdLwkJdbu" : [ ], 
       "bH5q4himZawTTrbyc" : [ ] 
     } 
} 

attendeeFavorites的关键是用户id。当该用户登录时,他们可能会将字符串添加到其相应的阵列。这是为使活性代码:

$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

为什么不只列出与会者的ID,然后保留一个单独的列表(可能是用户自己的一部分),其中包含他们各自的最爱? –

+0

如果您在事件对象中存储了某些内容,则订阅该对象的任何人都可以查看其内容。您可以使用角度的ng-show/hide来仅显示一个用户的收藏夹,但信息仍然存在。消除其他用户看到您的收藏的可能性的唯一方法是将其从原始“公共”事件对象中移除。 –

回答

0

创建一个订阅,是特定的用户:

Meteor.publish('user_favorites').then(function() { 
    return Events.find({attendeeFavorites: this.userId}) 
}); 

当您订阅它这将只返回收藏为与会者

然后:

$scope.favorites = $scope.$meteorCollection(Events).subscribe('user_favorites'); 

但是,如果你阅读角流星文档,最好使用$ 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']} 
] 

你如何塑造你的最爱我不知道,但没关系。每次用户访问一个页面时,他/她已经可以访问他们自己的收藏夹,那么您只需显示与该事件关联的收藏夹即可。这当然是,如果你有每个事件不同的收益。

真的,你不需要在每个事件中都保留一个与会者列表,但是这可能会派上用场以用于其他目的。

+0

感谢您的回复。我的第一个发布函数返回所有事件,但只显示该用户在事件中的收藏夹数组。恐怕您的每个事件都会返回所有字段,用户有一个与会者加入收藏。 –

+0

编辑下面原始答案。改变你如何储存你的最爱将是最好的选择。 –

+0

我同意这是对数据进行建模的更好方法,我最终可能会使用它。但是现在我真的很好奇,如果你要从数据中分离出所有的含义,我将如何解决原始问题。 –