带有一些自定义函数的猫鼬无限填充

时间:2019-10-17 01:38:44

标签: node.js mongodb mongoose

我对猫鼬模型有疑问

首先,我的英语不好,所以对语法错误(如果存在)感到抱歉

我创建了一个有关文件系统的架构,它拥有自己的子级引用,因此可以是无限级别的嵌套列表

看起来像这样

const Upload = new Schema({
    name: String,
    ext: String,
    dir: Boolean,
    description: String,
    share: [{type: Schema.Types.ObjectId, ref: 'Account'}],
    children: [{type: Schema.Types.ObjectId, ref: 'Upload'}],
    postedBy: {type: Schema.Types.ObjectId, ref: 'Account'},
    parentId: String,
    createdAt: {
        type: Date,
        default: Date.now
    },
    updatedAt: {
        type: Date,
        default: Date.now
    }
});

然后我要再次填充儿童和儿童

所以我用了一个叫做'pre'的钩子

看起来像这样

Upload.pre('find',async function(){
    this.populate('postedBy','profile')
        .populate('children','name ext dir description children createdAt');
});

工作正常

但仅适用于一个深度,而不再适用。

另一个问题是我需要格式化日期的列名称为'createdAt'

我知道可以通过“虚拟”创建自定义列

但似乎无法使用select

所以我在地图上使用了自定义功能

像这样

// list query
Upload.statics.list = async function(userId){
    const uploadList =
        await this
            .find({
                $and: [
                    {postedBy: userId},
                    {parentId: undefined},
                ]
            })
            .select('name ext dir description children createdAt')
            .sort({name: 1})
            .lean();

    return uploadList.map(formatDate);
};

//my custom function
exports.formatDate = obj => {

    const createdAt = _.cloneDeep(obj.createdAt);
    const formatDate = `${createdAt.getFullYear()}/${createdAt.getMonth()+1}/${createdAt.getDate()}`;

    return {...obj, formatDate};

};

我的根文档工作正常

但是人口稠密的孩子呢?

我不知道该如何处理

Upload.pre('find',async function(){
    this.populate('postedBy','profile')
        .populate('children','name ext dir description children createdAt');
    /* how to add custom column in this??? with my custom function */
});

所以我的问题是

  1. 如何为无限的儿童填充
  2. 这可以让我自定义函数以获取格式化日期吗?
  3. 如果可以,那么如何使用预钩子来填充文档?
  4. 当我删除一个孩子时,猫鼬会自动删除参考孩子吗?

感谢您的阅读,并感谢您的提前帮助

0 个答案:

没有答案