node.js - 将对象 ID 推送到嵌套数组 MongoDB/Mongoose
问题描述
所以我正在尝试为我正在开发的应用程序做一个简单的竖起大拇指系统,但是我在将用户 ID 推送到likes
数组时遇到了问题。这是我的代码的样子:
房间模式
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const classroomSchema = Schema({
clName: String,
clPosts: [{
title: String,
mssg: String,
date: String,
imageurl: String,
HERE==> likes: [{type: Schema.Types.ObjectId, ref: 'User'}]
}]
})
const Classroom = mongoose.model('Classroom', classroomSchema)
module.exports = Classroom
路由器
router.put('/put/classroom/post/like/:id', (req, res, next) => {
var data = data = req.body
Classroom.findByIdAndUpdate(
{
_id: req.params.id,
"clPosts": { _id: data.post }
},
{ $push: { "clPosts.$[outer].likes": [data.user] } },
{ "arrayFilters": [{ "outer._id": data.post }] }
).then((room) => {
console.log("Done");
res.json(room);
}).catch(next)
})
我已经尝试在 SO 上遵循其他建议,但我不确定我的配置是否不正确,或者是否有更好的方法将对象推送到嵌套数组中。
基本设置是,有一个包含教室对象的教室集合。在教室里,有一个posts
对象数组,在里面,一个likes
数组。这个想法是每当有人喜欢该帖子时,它将该用户的 ObjectID 保存到数组中,然后我用它来计算有多少喜欢,等等......
如果需要更多详细信息,请告诉我,MongoDB 没有关于嵌套数组的良好文档。
解决方案
clPosts
是一个子文档。_id
您通过->查询帖子,"clPosts": { _id: data.post }
但我相信,查询应该如下所示:"clPosts._id": { _id: data.post_id }
由于您使用mongoose
,您可以这样做:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const ClassRoomPostsSchema = new Schema({
title: String,
mssg: String,
date: String,
mageurl: String,
likes: [] // you will push ids here or else, if you need to store more data, e.g. date/time when like was given, create a schema for Likes e.g. likes: [likeSchema.schema]
})
const ClassRoomSchema = new Schema({
clName: String,
clPosts: [ClassRoomPostsSchema.schema]
})
然后在您的代码中:
router.put('/put/classroom/post/like/:id', (req, res, next) => {
ClassRoom.findOne({_id: req.params.id}, function(err, room) {
if (err) return next(err);
if (!room) return res.status(404).send('Classroom not found');
//Find a post by id
let post = ClassRoom.clPosts.id(data.post); // -> data.post_id
if (!post) return res.status(404).send('Post not found');
// Here you can push ids, but what is the idea behind? Maybe it makes more sense to count likes or push Like schemas (subdocument) to the array, e.g. post.likes.push(new Like(data));
post.likes.push();
room.save(function(err) {
if (err) return serverValidationError(req, res, err);
res.status(200).send('success');
});
});
})
推荐阅读
- c++ - 使用 C++ 中对象数组的所有组合初始化矩阵
- python - 切片在 python 中无法正常工作
- google-apps-script - 将数据从另一个电子表格导出到新生成的电子表格
- laravel - 在哪里放置用于检索过滤数据的代码?
- java - 如何使用Java中的给定字符串值从数组列表中查找最长前缀?
- python - 当图像以 0 到 9 的小数进行评级时,Earth Mover Loss 的输入类型应该是什么(Keras,Tensorflow)
- python - 子进程不正确地解释 MacOS `/private` 目录
- jquery - 如何将对象传递给 ASP.NET Core MVC 中的操作方法
- openstack - Devstack 安装失败并显示错误消息“XXX:未找到进程”
- scheme - 累积递归函数生成从最后到第一个的小计列表