1

我正在尝试使用 unique_with 参数对多个属性强制执行唯一约束。

ContentType = ('category', 'product')
PageType = ('category', 'product', 'compare', 'review')


class Content(db.Document):
    content_type = db.StringField(required=True, choices=ContentType)
    content_id = db.StringField(required=True)
    page_type = db.StringField(required=True, choices=PageType, unique_with=['content_type', 'content_id'])
    title = db.StringField()
    description = db.StringField()
    keywords = db.ListField(db.StringField())
    footer = db.StringField()

    def save(self, *args, **kwargs):
        super(Content, self).save(*args, **kwargs)

这会在我的本地开发机器上创建索引。但除了 _id 上的默认唯一索引外,无法在生产环境中创建索引。

在开发环境中,我使用单个 mongo 实例,而在生产环境中,我使用 3 个实例的副本集(1 个主实例、1 个从属实例和 1 个仲裁器)。

我还尝试通过以下代码手动创建索引:

PageType = ('category', 'product', 'compare', 'review')
ContentType = ('category', 'product')

class Content(db.Document):
    content_type = db.StringField(required=True, choices=ContentType)
    content_id = db.StringField(required=True)
    page_type = db.StringField(required=True, choices=PageType)
    title = db.StringField()
    description = db.StringField()
    keywords = db.ListField(db.StringField())
    footer = db.StringField()
    meta = {
        'indexes': [
            'content_type',
            'content_id',
            'page_type',
            {
                'fields': ['content_type', 'content_id', 'page_type'],
                'unique': True
            }
        ]
    }

    def save(self, *args, **kwargs):
        super(Content, self).save(*args, **kwargs)

我不确定我在这里做错了什么,或者我的代码中有错误。任何帮助都会很棒。

还有一条信息:django 应用程序正在使用相同的副本集,它能够创建复合索引。所以我认为副本集配置没有问题。

4

0 回答 0