【问题标题】:Mongoose find all then mark documents that match User IDMongoose 查找所有然后标记匹配用户 ID 的文档
【发布时间】:2018-08-11 22:49:23
【问题描述】:

查找所有记录的最佳方法是什么,Post 说,然后只用一些标志标记属于登录用户的帖子(假设一个帖子可以属于许多用户)。理想情况下,我希望这发生在服务器上,所以如果我有 100 条 Post.find({}) 的帖子,我可以获得如下所示的 Mongoose 文档或 JSON 对象:

[{title: "some Post", userPost: true}, {title: "another post}, {title: "third post", userPost: true}, {title: "Last post"}]

在这个结果中,我可以以特定方式装饰用户帖子。但是,我想查询所有帖子,但只查询用户帖子,因为这不是通过模板引擎,我需要在 JSON 响应中存在标志以指示与当前用户的关系。

目前,我有一个如下所示的函数:

let currentUser;
Post.find().exec( ( error, posts ) => {
    posts.map( ( p ) => {
            let userPosted = currentUser.posts.some((userPost) => {
                return userPost.equals(p._id)
            });
            return Object.assign(p.toObject(), {userPost: userPosted});
    } );
} );

有什么改进建议吗?这个过滤器功能应该在 Post 模型上使用吗?在初始查询中是否有更有效的方法来执行此操作?我知道 Mongoose 中的 lean() 将返回 JSON 而不是 Mongoose 文档,因此我不需要进行该转换。我对想法持开放态度。

【问题讨论】:

  • 类似Post.aggregate({$project:{"title":1, userPost:{$eq:['$_id', currentUser.ID]}}}).exec( ( error, posts ) => {} );
  • 感谢@Veeram。看起来这是要求返回标题的帖子聚合,userPost 设置为帖子的 ID 是否等于用户的 ID。对吗?
  • np。是的,这是正确的。
  • 在我的例子中,Post 模式有一个_idtitle。用户架构在currentUser.courses 中有一个帖子对象ID 数组。所以我需要看看,在聚合中,帖子的 ID 是否与任何用户帖子的 ID 匹配。所以我认为查看帖子的 ID 是否与用户的 ID 匹配没有帮助,因为它们永远不会相同。
  • 我明白了。在 3.4 mongo 服务器版本中尝试Post.aggregate({$project:{"title":1, userPost:{$in:['$_id', currentUser.posts]}}}).exec( ( error, posts ) => {} )

标签: javascript node.js mongodb mongoose


【解决方案1】:

我猜想是这样的:

    //first you need something associating the current user
    const currentUser = ?;
    const alteredPosts = [];
    //get all posts from Mongo
    Post.find({})
    .exec(error, posts => {
         if(error) console.error(error);
         //search through all posts and find those by the current user
         alteredPosts = posts.map( ( p ) => {
            if(p._id === currentUser._id) {
               p.currentUser = currentUser.id
            }
            return p;
         });
    })
 });

【讨论】:

  • 是的,感谢您的回复。看起来您的代码仅返回用户帖子。我想返回所有带有专门标记的用户帖子的帖子。在那种情况下,我想我会使用一些来查看帖子的 ID 是否与一些/任何 user.posts 的 ID 匹配。基本上我会返回posts.map let markedPosts = posts.map(..... 然后res.json(markedPosts)
  • 我认为没有地图或某些过滤器是您正在寻找的。 userPost 被标记为 true 的所有帖子都将在返回的数组中。如果 userPost 键不存在,则返回 p.userPost 将与 return undefined 相同,因为该键不存在,因此它不会在返回的数组中。
  • 我不关注这最后的评论。 user.posts 是一个数组,posts 是一个数组,其中每个帖子只有一个标题和 ID——这里没有用户数据。对于每个帖子,我需要遍历 user.posts 以查看 ID 是否与 post._id 匹配。作为回报,我想要一个包含所有帖子的数组,而不仅仅是用户帖子。我没有看到过滤器如何给我所有的帖子。它要么只给我用户帖子,要么给我未定义的,但我仍然需要非用户帖子数据。我错过了什么吗?
  • 很难理解你想要做什么。调用模型 Post 有点令人困惑。所以,这是你正在做的 router.post 而不是 router.get?那么,会有一个新帖子,您想查找与帖子请求中发送的用户具有相同 id 的所有帖子?
  • 哦,对不起,Post 的模型就像一篇文章 - 与 HTTP 方法类型无关。所以我们可以忘记数据是如何与服务器通信的。我只是在寻找一个最佳约定来修改从我的数据库返回的数据,以将一些数据标记为与currentUser 有关联
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 2023-03-22
  • 2017-05-13
  • 1970-01-01
  • 2018-04-26
  • 2019-05-06
  • 2019-07-14
  • 2013-09-24
相关资源
最近更新 更多