【问题标题】:Python mongoengine - GET ID of the last entryPython mongoengine - 获取最后一个条目的 ID
【发布时间】:2021-01-22 14:35:24
【问题描述】:

我有一个场景,我需要在我的 mongoDB 中创建几个产品的克隆。我使用以下代码

    for single_product in survey_products:
        cloned_product = without_keys(single_product, {'_id'})
        cloned_product_doc = Product(**cloned_product)
        cloned_product_doc.save()
        print(cloned_product_doc.id)
        print(cloned_product_doc._id)

这可以正确创建记录,但在两个 print 函数中,即使我在访问 IDs 之前调用 cloned_product_doc.save(),我也会得到 None

如何获取新条目的ID

已编辑

这是模型定义

class Product(Document):
# model
_id = ObjectIdField()
photo = StringField()
name = StringField()
price = FloatField()
currency = StringField()

class Meta:
    db_table = 'product'

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案1】:

    如下编辑模型定义,确保将 ObjectId 定义为默认值

    .........................
    from mongoengine import *
    from bson import ObjectId
    #import objectID to use as default
    
    class Product(Document):
    # model
    _id = ObjectIdField(default=ObjectId)  # mention default as ObjectId
    photo = StringField()
    name = StringField()
    price = FloatField()
    currency = StringField()
    class Meta:
        db_table = 'product'
    

    【讨论】:

      【解决方案2】:

      在正常使用情况下,Mongoengine 在调用 .save() 时会将 id 添加到实例中。

      from mongoengine import *
      
      connect()
      
      class MyDoc(Document):
          # Mongoengine adds an id = ObjectIdField if no 'id' is provided
          s = StringField()
      
      doc = MyDoc(s='garbage').save()
      print(doc.id)    # e.g 600df8c3d87af06b92725f87
      

      我建议检查您的cloned_product 中的内容。也许还有一个剩余的“id”键或干扰默认行为的东西

      【讨论】:

      • 不,cloned_product 没有 id_id
      • 也用模型定义编辑了问题
      • 我也会避免使用“_id”,在模型定义中使用“id”。 MongoEngine 在幕后管理一个属性“_id”,也许你正在干预它。 MongoEngine 也不支持将 Meta 定义为一个类(这是一个简单的 dict,请参阅 docs.mongoengine.org/guide/…),因此您的 Meta 当前被忽略
      猜你喜欢
      • 2021-12-09
      • 2013-10-24
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      相关资源
      最近更新 更多