复合唯一约束mongoengine不使用replicaset

时间:2015-01-08 08:01:28

标签: mongodb flask pymongo mongoengine replicaset

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

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应用程序正在使用相同的副本集,它可以创建复合索引。所以我不认为副本集配置存在问题。

0 个答案:

没有答案