检索mongoDB中数组中的所有元素

时间:2014-10-09 14:41:29

标签: mongodb meteor

如何将数组赋值给变量。我能够返回我想要的文档,但不能专门获取特定字段内的数组中的所有元素。该字段称为“喜欢”。

我想要过滤我想要的文件:

Posts.find({}, {owner: Meteor.user()})

我想从Posts集合中检索名为'likes'的数组字段中的所有元素。 ('likes'字段中的每个元素都是一个对象ID)

我尝试了各种运营商,例如'all'字段中的$ all和$ in,并在console.log中进行了测试,但我无法获得ID。根据mongo文档,我需要在运算符中指定一个元素,但我不希望这样。我只想要内心的任何东西。

var likers = Posts.find({}, {owner: Meteor.user()}, {likes: {$in: [] }})

基本上,我试图从'喜欢'字段中检索所有元素,这样我就可以进行另一个查询来返回结果。

我正在运行流星0.9 +

3 个答案:

答案 0 :(得分:5)

尝试一下:

var myPosts = Posts.find(
  {owner: Meteor.user()},
  {fields: {likes: 1}}
).fetch()

var myLikes = _.chain(myPosts)
  .pluck('likes')
  .flatten()
  .uniq()
  .value();

首先,我们获取当前用户所有者的所有帖子。每个帖子都会包含_idlikes数组。接下来我们通过以下方式提取所有喜欢的内容:

  1. 从每个文档中提取每个likes。这为我们提供了一系列数组。
  2. 将数组数组展平为单个数组。
  3. 运行uniq,因此我们只有独特的喜欢(不是必需的,但可以是优化)。
  4. 然后,您可以在后续查询中使用myLikes。例如:

    Likes.find({_id: {$in: myLikes}})
    

    以下是myPosts为空的情况下的一些测试数据:

    var myPosts = [
      {_id: 1, likes: [1, 2, 3]},
      {_id: 2, likes: [2, 3, 4]},
      {_id: 3, likes: [4, 5, 6]}
    ];
    

    在这种情况下,myLikes将是:[ 1, 2, 3, 4, 5, 6 ]

答案 1 :(得分:1)

您可以指定光标所包含的字段,以便将其限制为likes字段:

var allLikes = Posts.find({
  owner: Meteor.user()
}, {
  fields: {likes: 1},
}).fetch();

这将为您提供所有帖子的数组,其中每个帖子仅包含likes数组:

[{
  likes: ['A', 'B', 'C'],
}, {
  likes: ['D', 'E'],
}];

等。现在,我知道你想要一个包含所有objectID的单个数组。为此,您可以使用下划线转换数组。有许多方法可以获得结果,例如:

var likes = _.reduce(allLikes, function(memo, post) {
  return memo.concat(post.likes);
}, []);

答案 2 :(得分:0)

我刚刚意识到,在Posts.find查询中,我必须插入一个空的标准才能工作。所以这一变化导致了以下结果。

var myPosts = Posts.find(
{},
{owner: Meteor.user()},
{fields: {likes: 1}}
).fetch()

无论哪种方式,如果没有你的输入我就无法得到这个结果,所以加上一个给你大卫!