如何在Python中使MongoDB字段组合唯一

10 投票
2 回答
4060 浏览
提问于 2025-04-17 16:36

我想创建一个表格,其中有两个字段组合在一起形成一个索引字段。我的Python代码如下。我想要做的是让组合的字段 course_namegroup_name 变得唯一,这样就不能创建两个相同的 course_namegroup_name 的组。有人能帮我解决这个问题吗?

class SocialGroup(Document):
    timestamp = DateTimeField(default=datetime.now)
    course_name = StringField()
    group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None")

2 个回答

4

来自:http://docs.mongoengine.org/guide/defining-documents.html#uniqueness-constraints

你还可以通过使用 unique_with 来指定多个字段的唯一性约束,这个可以是一个字段名,也可以是一个字段名的列表或元组。

在你的情况下:

class SocialGroup(Document):
    timestamp = DateTimeField(default=datetime.now)
    course_name = StringField()
    group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None",
                             unique_with='course_name')

或者更复杂的情况:

group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None",
                         unique_with=['course_name', 'another_field', 'more_field'])
14

你可以在类的 meta 字典里指定 索引

class SocialGroup(Document):
    timestamp = DateTimeField(default=datetime.now)
    course_name = StringField()
    group_name = StringField(choices=[('A', 1), ('B', 1), ('C', 1),('D', 1), ('E', 1), ('F', 1), ('None',1)], default="None")
    meta = {
        'indexes': [
            {'fields': ('course_name', 'group_name'), 'unique': True}
        ]
    }

撰写回答