List 字段中的 Mongoengine String Field 使唯一

Mongoengine String Field in List field make unique

我为 API 服务器使用 mongoengine 和 flask-restplus。

我的模型来了

from datetime import datetime
from mongoengine import *
from config import DB_NAME

connect(DB_NAME)

class Board(Document):
    d = datetime.now()
    date = "{}-{}-{}".format(d.year, d.month, d.day)

    no = SequenceField()
    title = StringField(required=True)
    body = StringField(required=True)
    tags = ListField(StringField(unique=True))
    password = StringField(required=True)
    created_at = DateTimeField(default=date)
    updated_at = DateTimeField(default=date)

我定义了tags = ListField(StringField(unique=True)).

因为文章不能有重复的标签。

插入标签代码在这里。

tag = ~some user input here~
article = Board.objects.get(no=article_no)
article.tags.append(tag)
article.save()

但是当我插入重复的数据时,它存储了两次数据。

我想 tags 有不同的数据。

为什么 unique=True 不起作用?

这个问题有什么解决办法吗?

这是一个 explanation why does it not work. As a workaround you could use $addToSet operator provided by Mongo. It is also implemented in Mongoengine(docs),示例用法如下所示

Board.objects(no=article_no).update_one(add_to_set__tags=tag)

其中标签可以是字符串或字符串列表