【问题标题】:mongoose extract nested arrays from multiple objects into one arraymongoose 从多个对象中提取嵌套数组到一个数组中
【发布时间】:2018-12-17 21:06:36
【问题描述】:
const userSchema = new Schema(
  {
    _id: Schema.Types.ObjectId,
    name: String,
    posts: [{ type: Schema.Types.ObjectId, ref: "Post" }],
    following: [{ type: Schema.Types.ObjectId, ref: "User" }]
  }
};

我想从 'following' 数组中的所有用户中提取所有帖子,将它们放入一个数组中,对它们进行排序,然后显示前 20 个。我想知道这是否可以在光标内进行,或者我是否可以必须将其加载到内存中。

function createFeed(user) {
  User.findOne({ name: user })
    .populate({
      path: "following",
      populate: {
        path: "posts"
      }
    })
//put all the posts into one array
.sort(...)  //sort by time created
.limit(...) //only get the newest n posts
.exec((err, result) => {
      if (err) console.log("error", err);
      console.log("result", //sorted tweets array);
 });
};

(我不想过滤我的“帖子”集合中的所有帖子以检查它们是否由用户制作,因为那样会更昂贵)

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    你可以在mongoDB中使用distinct查询

    db.User.distinct('following',{})
    

    【讨论】:

    【解决方案2】:

    如果您尝试使用条件过滤填充,那么您应该这样做:

    User.findOne({ name: user })
    .populate({
        path: 'posts',
        match: { user: 'XXX' }
    })
    

    更好的是用用户过滤条件查询帖子,然后填充用户详细信息。

    【讨论】:

    • 感谢您的回答,但是,我真的不明白match() 是如何解决我的问题的。我需要过滤我的Post db 以查找由我当前用户关注的人创建的帖子。一种天真的方法是只使用像.find({post.creator: {in: currentUser. followers}}) 这样的东西,但如果我这样做,那么我必须过滤我的整个“帖子”数据库,这是巨大的。如果我只想查看当前用户关注的人的帖子,我可以通过 user.following.posts 直接访问它们。但我也想对它们进行排序而不将它们全部加载到内存中......
    • 如何使用带有 $filter 的聚合查询。它只是一个提示。你可以试试。
    猜你喜欢
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    相关资源
    最近更新 更多