这是我想做的事情:
在数据库中抛出一个新文档,如果匹配(基于部分或全部唯一性约束),它会丢弃更新的现有文档。
我有一系列公司:
class Company(DynamicDocument):
name = StringField(unique=True, sparse=True)
domain = StringField(unique=True, sparse=True)
...
在某些情况下,传入的信息包含:
这是我想要的行为:
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
当我走下兔子洞试图让这个混乱功能时,我意识到必须有一个更好的方法来做我想做的事。
有任何想法可以更清晰地实现这一目标吗?