【问题标题】: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']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        • 2014-02-10
        • 2019-01-22
        • 1970-01-01
        • 2011-08-25
        相关资源
        最近更新 更多