node.js - 如何将 Likes 集合聚合到 MongoDB 中的 Posts 集合?
问题描述
场景:我们有一个应用程序,其中包含 Posts 集合和一个 Likes 集合,其中 postId 和 customerId 与之关联。这两个集合的架构定义如下:
// Post Schema
let postSchema = new Schema({
user: {type: Schema.Types.ObjectId, ref: "user"},
text: {type: String},
likeCount: {type: Number}
)}
// Like Schema
let likeSchema = newSchema({
post: {type: Schema.Types.ObjectId, ref: "post"},
user: {type: Schema.Types.ObjectId, ref: "user"},
})
案例:我将获取帖子(带分页)。但是,我还想发送一个指示符,说明用户是否已经喜欢这篇文章。
问题:
- 获取一组带有添加指示符(或新键)的文章的最佳方式是,该指示符说明现有用户是否喜欢它。(我将在执行查询时拥有 userId)。
- 聚合会是一个不错的选择吗?如果是,我该如何聚合它?真的和管道混淆了。
- 如果不是聚合,如果用户喜欢或不喜欢帖子,还有什么可能是最好的映射方式?
附加细节:我们在服务器端使用 Node.Js,我们将索引 likes 集合。
解决方案
Users.aggregate([
{
$lookup: {
from: "likes", // likes collection name
localField: "_id",
foreignField: "user",
as: "user",
},
},
{
$addFields: {
isLiked: { ifNull: ["$user", false] },
},
},
{
$skip: pageNumber > 1 ? (pageNumber - 1) * nPerPage : 0,
},
{
$limit: nPerPage,
},
]);
pageNumber in page nPerPage 是每页中的文档数
推荐阅读
- reactjs - react native - 如何将参数从一个组件传递到另一个组件?
- git - Git 对两个单独的提交进行更改
- assembly - 如何在 DOSBox 中运行的汇编程序中将文本插入剪贴板?
- java - Java AWS 无服务器 Lambda
- bash - 关闭具有特定名称的 tmux 会话
- azure - az 管道中使用托管标识的 az 登录失败
- python - Upvote 动作正在为所有卡片执行 django
- javascript - 使用 Cypress 在某些元素消失后单击
- javascript - 多功能 onClick javascript
- python - Python:通过函数构造类(和变量名)?