2014-10-29 71 views
0

我试图找到一种方法来实现服务器上的以下伪功能。字段likesRecievedlikesShownlikesMatch存在于Posts集合中的一个文档中。文档插入时的超越功能

默认情况下,我需要此功能才能执行收集的每个文档。这是因为Id喜欢这样做的功能...

1)找到存在于likesRecieved和likedShown字段中的值。

2)在likesMatch字段中插入这些值。在操作1中

3)移除值从likesRecieved和likesShown

这就是我基本上是试图在服务器上做...

likesRecieved: idA, idB, idE, idF, idL 
likesShown: idE, idC, idF 

..perform a function to result in the following... 

likesRecieved: idA, idB, idL 
likesShown: idC, 
likesMatch: idE, idF 

这是我的代码仅在一个文档中查找两个数组中的ID。 likeMatch助手返回Posts集合中选定文档中'likesRecieved'和'likesShown'字段中可能存在的userIds。然后将结果值插入到likesMatch字段中。

likeMatch: function() { 
    var selectedPostId = Session.get('postId'); // _id of document in Post collection 

     var arrayOfLikeRecieved = Posts.find({_id: selectedPostId}, {fields: {LikesRecieved: 1}}).fetch(); 
     var sumArrayRecieved = _.chain(arrayOfLikeRecieved).pluck('LikesRecieved').flatten().value(); 

     var arrayOfLikeShown = Posts.find({_id: selectedPostId}, {fields: {LikesShown: 1}}).fetch(); 
     var sumArrayShown = _.chain(arrayOfLikeShown).pluck('LikesShown').flatten().value(); 

    var duplicates = _.intersection(sumArrayRecieved, sumArrayShown); 
    Meteor.call('insertDuplicateIntoMatchField', duplicates); 

}, 
+0

你是否曾想过在服务器上为MongoDB编写一些本地代码?可爱的下划线/ lodash的东西,但服务器做得更好。 “忘掉你所学到的东西” - 智者杰迪大师 – 2014-10-29 17:10:56

+0

这就是我的想法。因为我不知道从哪里开始,所以我在这里提出了这个问题。因此,链接到相关文档将对我的工作非常有帮助。谢谢 – meteorBuzz 2014-10-29 17:21:55

回答

1

的MongoDB没有挂钩像一些其他的数据库做,所以没有办法自动已经被插入文档时调用的函数。

虽然你有几个选择。一种方法是在插入文档以运行函数之前运行应用程序中的钩子。这可以通过使用Collection.deny function在流星中实现。

如果您希望让函数在mongodb中执行,那么您必须手动调用该函数。问题在于如何知道何时插入或更新文档。幸运的是,流星允许你将光标移动到observe changes。您可以使用它来调用数据库并在文档更新时运行存储过程(函数)。

+0

这个解释很有帮助。我认为观察更改将是最好的选择,因为我只需要插入时执行该函数。 我将修改如何通过添加拒绝规则来填充likesMatch字段。谢谢allTwentyQuestions – meteorBuzz 2014-10-30 10:09:06