如何在没有(不推荐使用)get_or_create的mongoengine中插入upsert时插入?

时间:2014-03-04 16:04:27

标签: mongodb pymongo mongoengine

我需要知道是否使用MongoEngine(或者如果需要,pymongo)插入了插件。

代码如下所示:

ret = MyMongoCollection.objects(name=desiredname)
            .update_one( { upsert: True, field1: 2 } )

Mongoengine似乎只返回" num_affected"根据定义,这里总是精确到1。

我知道这些存在,但我正在寻找Python风格。

2 个答案:

答案 0 :(得分: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']

答案 1 :(得分:0)

我找不到直接的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']