【发布时间】: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 模式有一个
_id和title。用户架构在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