【问题标题】:Retrieve all elements in an array in mongoDB在 mongoDB 中检索数组中的所有元素
【发布时间】:2014-10-10 06:34:21
【问题描述】:

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

我的查询过滤我想要的文档:

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

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

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

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

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

我正在运行流星 0.9+

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

    试试这个:

    var myPosts = Posts.find(
      {owner: Meteor.user()},
      {fields: {likes: 1}}
    ).fetch()
    
    var myLikes = _.chain(myPosts)
      .pluck('likes')
      .flatten()
      .uniq()
      .value();
    

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

    1. 从每个文档中提取每个likes。这为我们提供了一个数组数组。
    2. 将数组数组展平为单个喜欢数组。
    3. 运行uniq,这样我们就只有独特的喜欢(不是必需的,但可能是一种优化)。

    然后您可以在后续查询中使用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 ]

    【讨论】:

    • 嗨,大卫,我试过了。将 myLikes 变量放入 console.log 并放入另一个查询后,没有返回值。
    • 可能myPosts 对您来说是一个空数组,因为文档不存在或未发布。假设我得到了正确的数据结构,myLikes 代码是正确的。我在答案的底部添加了一些测试数据以进行验证。
    • 谢谢,所以。吓坏了。很多。
    • @DavidWeldon 谢谢!我一直在寻找这个几个月!
    【解决方案2】:

    您可以指定您希望光标包含哪些字段,因此您可以将其限制为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);
    }, []);
    

    【讨论】:

    • 每个帖子只有一个数组。里面是一个对象ID列表。所以下划线方法不是必需的,但感谢您指出我可以记住未来。从一个单一的数组,比如你写的那个 ['A', 'B', 'C'] 我想在一个变量 AllLikes 中使用这个。然后,查询另一个集合 Forms.find({_id: allLikes});
    • 基本上,我正在尝试检索“喜欢”字段的数组中的所有值。然后使用这些值查询另一个集合。
    【解决方案3】:

    我刚刚意识到,在 Posts.find 查询中,我必须插入一个空条件才能使其工作。因此,更改导致以下内容。

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

    不管怎样,如果没有你的意见,我不可能得出这个结果,所以给你加一个大卫!

    【讨论】:

      猜你喜欢
      • 2013-03-03
      • 1970-01-01
      • 2019-06-26
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多