具有唯一索引的集合的Mongoengine自定义保存

时间:2018-04-01 16:17:40

标签: python mongoengine

这是我想做的事情:

在数据库中抛出一个新文档,如果匹配(基于部分或全部唯一性约束),它会丢弃更新的现有文档。

我有一系列公司:

class Company(DynamicDocument):
    name = StringField(unique=True, sparse=True)
    domain = StringField(unique=True, sparse=True)
    ...

在某些情况下,传入的信息包含:

  1. 名称和域名(我使用未显示的其他字段来定义文档)
  2. 名称或域名,但不是两者都
  3. 域名和域名
  4. 这是我想要的行为:

    if not name and not domain:
        return document(...).save()
    elif name or domain:
        # check for existing match to either name or domain
        if existing doc:
            return document.modify(...)
        else:
            return document(...).save()
    

    (我认为)我想添加一个自定义保存方法,以避免在尝试保存文档之前编写模块以针对每个唯一索引进行验证。我有另外8个具有自己唯一性限制的集合,我想尽可能地抽象出这个解决方案。

    为此,我尝试了一些相当复杂的东西,当我编写它时感觉不对,只有当场景3有两个完全匹配时才能工作(我添加这个杂乱的代码只是为了证明我尝试过):

    @classmethod
    def csave(cls, **kwargs):
        d = cls(**kwargs)
        try:
            doc = d.save()
        except NotUniqueError:
            # get unique indexes for the collection
            indexes = d._unique_with_indexes()
            # get the specific fields
            fields = [f['fields'][0][0] for f in indexes if f.get('unique')]
            # build a search dictionary
            matches = {k: v for k, v in kwargs.items() if k in fields}
            doc = cls.objects(**matches).first()
            return doc
        else:
            return doc
    

    当我走下兔子洞试图让这个混乱功能时,我意识到必须有一个更好的方法来做我想做的事。

    有任何想法可以更清晰地实现这一目标吗?

0 个答案:

没有答案