Sequelize - 如何应用Distinct到嵌套包含?

时间:2018-02-21 19:34:49

标签: node.js postgresql sequelize.js

我正在使用Nodejs,Express,Postgresql和Sequelize

我有4个模特

  1. 帐户(有很多书)

  2. 书(有很多部分)

  3. 部分(有很多章节)
  4. 我要归还一本书,并且包括' Part'和'章'有一些特定的顺序 - 这很好。

    模型'章'有专栏'主题'而且我只想要包含“'章节”中的行。具有不同主题的模型'。

    我如何应用这个'章节'这个嵌套的包含结构的模型?

    代码段:

    return Book
    
    .findOne({
        where: {accountid: req.body.accountid,
            id: req.body.bookid}, 
        include: [{
            model: Part,
            as: 'parts'
            include: [
                {
                    model: Chapter,
                    required: false,
                    as: 'chapters',
                    where: {
                        createdAt: {
                            $gte: moment().subtract(24,'hours').format()
                        }
                    }
                }],
        }],
        order: [
            [
                { model: Part, as: 'parts' },
                'createdAt',
                'DESC'
            ],
            [
                { model: Part, as: 'parts' },
                { model: Chapter, as: 'chapters' },
                'createdAt',
                'DESC'
            ]
        ]
    
    
    })
    .then(book => res.status(200).send(book))
    .catch(error => res.status(400).send(error.toString()));
    }
    

2 个答案:

答案 0 :(得分:2)

  

Seludeize不同的功能在包含的情况下不起作用。

您可以使用sequelize原始查询来实现结果。

答案 1 :(得分:0)

我知道这是一个很晚的答案,但实际上您可以在include表列上有区别。唯一的缺点是您必须分析Sequelize生成的查询并包括每个模型的属性。

您的查询最终将如下所示:

Book.findOne({
    // Literal DISTINCT ON as 1 so it is not included in the resulting json
    // '*' so all table attributes are included in the json response
    attributes: [Sequelize.literal('DISTINCT ON("chapters"."topics") 1'), '*']
    where: {accountid: req.body.accountid,
        id: req.body.bookid}, 
    include: [{
        model: Part,
        as: 'parts'
        include: [
            {
                model: Chapter,
                required: false,
                as: 'chapters',
                where: {
                    createdAt: {
                        $gte: moment().subtract(24,'hours').format()
                    }
                }
            }],
    }],
    order: [
        // This order criteria is required because we are using distinct on
        [
            { model: Chapter, as: 'chapters' },
            'topics',
            'ASC'
        ],
        [
            { model: Part, as: 'parts' },
            'createdAt',
            'DESC'
        ],
        [
            { model: Part, as: 'parts' },
            { model: Chapter, as: 'chapters' },
            'createdAt',
            'DESC'
        ]
    ]


})

可以使用相同的策略来“区分”多个列,但是您必须记住将这些列作为第一个搜索条件。
在Sequelize的Github上搜索“ DISTINCT ON”会导致一些有趣的帖子。

希望有帮助。智利的最诚挚问候。