【问题标题】:How do I tell if I inserted during upsert in mongoengine without (the deprecated) get_or_create?如何判断我是否在没有(已弃用的)get_or_create 的情况下在 mongoengine 的 upsert 期间插入?
【发布时间】:2014-04-06 06:46:11
【问题描述】:
我需要知道是否使用 MongoEngine(或必要时使用 pymongo)插入了 upsert。
代码如下所示:
ret = MyMongoCollection.objects(name=desiredname)
.update_one( { upsert: True, field1: 2 } )
Mongoengine 似乎只返回“num_affected”,根据定义,此处始终为 1。
我知道这些存在,但我正在寻找 Python 风格。
【问题讨论】:
标签:
mongodb
pymongo
mongoengine
【解决方案1】:
这是另一个使用 pymongo 的答案,它始终提供相关的 ID。如果字段是新的,上面的 update() 答案只会为您提供 ID。
upsert_results = MyMongoCollection._get_collection().find_and_modify(
{
'name':desiredName,
# NOTE: _cls (below) only necessary if you meta.allow_inheritance=True
'_cls': MyMongoCollection._class_name
},
{'$set': {'field1': 2}}, # always provide a $set even if {} or it will no-op.
upsert=True, full_response=True, new=True, fields=['_id'])
obj_id = upsert_results['value']['_id']
obj_created = not upsert_results['lastErrorObject']['updatedExisting']
【解决方案2】:
我找不到直接的 Mongoengine 答案,但在 PyMongo 中混合,等效调用是:
upsert_results = MyMongoCollection._get_collection().update(
{
'name':desiredName,
# NOTE: _cls (below) only necessary if you meta.allow_inheritance=True
'_cls': MyMongoCollection._class_name
},
{'$set': {'field1': 2}},
upsert=True, multi=False)
obj_id = upsert_results.get('upserted',False) # key only exists if true.
obj_created = not upsert_results['updatedExisting']