我有三个 Mongoose 模式:User、ShowsList 和 Show。它们如下(为简洁起见,进行了简化):
用户架构:
name: {
type: String
},
email: {
type: String
},
password: {
type: String
},
role: {
type: Number
};
ShowsList 架构:
showsListOwner: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
shows: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Show'
}]
显示架构:
showId: {
type: Number
},
showName: {
type: String
},
showPremiereDate: {
type: String
}
每次向
ShowsList.shows
数组添加节目时,我都会使用 Mongoose unshift
运算符将给定 Show
的 ObjectId 添加到 ShowsList.shows
数组的第一个位置。
我在我的应用程序中创建了一个按钮,用于按填充的
showName
字段按字母顺序对数组进行排序。我能够查询数组、填充它并按字母顺序排序,但我不知道如何更新/保存排序后的数组。我的后端代码是:
const userId = req.body.user._id;
const showsListPopulatedSorted = await ShowsList.findOne(
{
showsListOwner: userId
}
).populate(
{
path: 'shows',
options: {
sort: {
'showName':1
}
}
}
);
我不确定从这里该去哪里。我已经尝试过了
await showsListPopulatedSorted.save();
但给定用户的 ShowsList.shows
数组在保存后仍未排序。我尝试在保存之前使用 await showsList.shows.deleteMany({});
清除数组,但这也没有帮助。
我知道如何向 Mongo 数组添加/删除一个或多个元素/文档,但我似乎不知道如何用新排序的版本替换整个数组。
如果有人能指出如何成功执行最后一步,将未排序的
ShowsList.shows
数组替换为按字母顺序排序的 ShowsList.shows
数组的正确方向,我将不胜感激!
注意:如果您打算否决我的问题,请至少留下评论说明原因。我的问题写得不好吗?你只是不喜欢我的用户名吗?你今天只是感觉脾气暴躁吗?我过去遇到过一些问题,人们在没有任何解释的情况下对我看似写得很好的问题投了反对票,所以我决定开始添加此请求。 :)
经过一个小时的努力我终于弄清楚了!
获取给定用户的完整
ShowsList
文档后,我将填充的 Refs 的 shows
数组提取到它自己的变量中。然后,我使用 .map()
函数构建仅包含 ObjectId
的数组,然后将完整文档中的 shows
ObjectId 数组设置为等于排序后的 ObjectId
中新建的 shows
数组数组并保存了整个文档。
执行此操作后,
ObjectId
引用列表现在按其各自的showName
字符串值在Mongo集合文档中的字母顺序显示。
这是完成该工作的后端路由的完整代码:
exports.sortShows = async(req, res, next)=>{
const userId = req.body.user._id;
try{
const showsListPopulatedSorted = await ShowsList.findOne(
{
showsListOwner: userId
}
).populate(
{
path: 'shows',
options: {
sort: {
'showName':1
}
}
}
);
const showsListPopulatedSortedShows = showsListPopulatedSorted.shows;
const showsObjectIdArray = showsListPopulatedSortedShows.map((show)=>{
return show['_id'];
});
showsListPopulatedSorted.shows=showsObjectIdArray;
await showsListPopulatedSorted.save();
}catch(err){
console.log(err);
};
};