Node.js Mongoose数组对象存在性判断及帖子点赞状态查询
解决Mongoose中返回带用户点赞状态的帖子列表问题
嘿,这问题我熟!要实现返回包含当前用户点赞状态的帖子列表,咱们可以借助Mongoose的聚合框架来完成,不用额外的查询操作,一步到位。
实现思路
核心是利用$addFields聚合操作符,给每个帖子添加一个自定义字段(比如isLiked),通过$in判断当前请求的用户ID是否存在于帖子的likes.userId数组中,从而得到点赞状态。
具体代码实现
假设你用Express来写接口,代码大概是这样的:
const mongoose = require('mongoose'); const Post = require('./models/Post'); // 导入你的Post模型 const express = require('express'); const router = express.Router(); router.get('/get_posts/:userID', async (req, res) => { try { // 把URL参数里的userID转换成Mongoose的ObjectId类型 const currentUserId = mongoose.Types.ObjectId(req.params.userID); // 聚合查询帖子列表,添加点赞状态字段 const posts = await Post.aggregate([ { $addFields: { // 判断当前用户ID是否在likes数组的userId中,返回布尔值 isLiked: { $in: [currentUserId, "$likes.userId"] } } }, // 可选:如果你需要返回指定字段,可以加$project { $project: { message: 1, likeCount: 1, isLiked: 1 // 其他你需要的字段都可以在这里指定 } } ]); // 按照要求的格式返回 res.status(200).json({ posts }); } catch (err) { res.status(500).json({ error: err.message }); } }); module.exports = router;
代码解释
mongoose.Types.ObjectId(req.params.userID):因为你的Post模型里likes.userId是ObjectId类型,所以必须把URL里的字符串ID转换成对应的类型,否则$in判断会失效。$addFields:这个操作符会给每个文档添加新字段(这里是isLiked),不会修改原文档结构。$in: [currentUserId, "$likes.userId"]:MongoDB的数组判断操作,检查currentUserId是否存在于likes数组的每个元素的userId字段组成的集合中,返回true或false。- 可选的
$project:如果你不想返回帖子的所有字段,可以用这个操作符指定需要返回的字段,让响应更精简。
示例返回结果
按照你的要求,返回的格式会是这样的:
{ "posts": [ { "_id": "5ae1975acf8db214e4a920cf", "message": "test...", "likeCount": 12, "isLiked": true }, { "_id": "5ae1976acf8db214e4a920d0", "message": "another post...", "likeCount": 5, "isLiked": false } ] }
这样就能完美满足你的需求啦,每个帖子都带上了当前用户是否点赞的状态~
内容的提问来源于stack exchange,提问作者lohith cb
相关产品推荐
相关产品推荐

