使用 Mongo 集合中的排序数组更新 Refs 数组

问题描述 投票:0回答:1

我有三个 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
数组的正确方向,我将不胜感激!


注意:如果您打算否决我的问题,请至少留下评论说明原因。我的问题写得不好吗?你只是不喜欢我的用户名吗?你今天只是感觉脾气暴躁吗?我过去遇到过一些问题,人们在没有任何解释的情况下对我看似写得很好的问题投了反对票,所以我决定开始添加此请求。 :)

mongodb mongoose
1个回答
0
投票

经过一个小时的努力我终于弄清楚了!

获取给定用户的完整

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);
    };
};
© www.soinside.com 2019 - 2024. All rights reserved.