【问题标题】:Publish cursor with simplified array data发布带有简化数组数据的游标
【发布时间】:2015-04-23 14:44:44
【问题描述】:

我需要向用户发布简化版的帖子。每个帖子都包含一个“喜欢”数组,其中包含所有喜欢/不喜欢该帖子的用户,例如:

[
    { 
        _id: user_who_liked, 
        liked: 1 // or -1 for disliked 
    }, 
    ..
]

我正在尝试向订阅数组的用户发送一个简化版本,该数组仅包含他/她的喜欢:

Meteor.publish('posts', function (cat) {
  var _self = this;
  return Songs.find({ category: cat, postedAt: { $gte: Date.now() - 3600000 } }).forEach(function (post, index) {
    if (_self.userId === post.likes[index]._id) {
      // INCLUDE
    } else
      // REMOVE

    return post;
  })
});

我知道我可以更改结构,包括每个用户中的“喜欢”数据,但帖子通常设计为短暂的,最好将这些数据保留在每个帖子中。

【问题讨论】:

  • 将我的答案编辑为更简单的方法。

标签: mongodb meteor minimongo


【解决方案1】:

您需要使用这种特殊语法来查找具有 likes 字段的帖子,该字段包含一个数组,该数组包含至少一个嵌入文档,该文档包含字段 by,值为 this.userId

Meteor.publish("posts", function (cat) {
  return Songs.find({
    category: cat,
    postedAt: { $gte: Date.now() - 3600000 },
    "likes._id":this.userId
  },{
    fields:{
      likes:0
    }
  });
});

http://docs.mongodb.org/manual/tutorial/query-documents/#match-an-array-element

编辑:答案以前使用$elemMatch,这是不必要的,因为我们只需要过滤一个字段。

【讨论】:

  • 这种方法有效,但不会使用$elemMatch 放弃对 oplog 的支持? https://kadira.io/academy/optimize-your-app-for-oplog。还是只发生在客户端查询中?
  • 对不起,我完全忘记了我是想在这里实现的。我使用forEach 的第一种方法也是过滤每个帖子上的数据。这样,服务器将发送一个转换后的单字段“喜欢”数组,而不是用户不需要的 100 个元素。这是我不知道如何实现的方法。
  • 在这种情况下,您应该查看字段选项:查看我的编辑,我从返回的文档中完全删除了 likes 数组。
猜你喜欢
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
  • 2017-04-26
相关资源
最近更新 更多