2014-07-14 9 views
5

varsayalım ben MongoEngine ile tanımlanan belgelerin bir koleksiyonu vardır:Mongoengine update_one

class Project(Document): 
    name = StringField(required=True) 
    client = StringField(required=True) 
    code = StringField(required=True,unique=True) 
    created = DateTimeField(required=True,default=datetime.datetime.now) 

Tarihsel olarak ben bir "eklemek veya güncelleştirmek" tipi işlemi gerçekleştirmek için get_or_create yöntemini kullanmış olabilir. Örneğin:

koleksiyonuna şu dokümanı ekler
Project.objects().get_or_create(name="Test Project One", 
           client="Client One", 
           code="CL1-001") 

:

Project.objects(code="CL1-002").update_one(set__name="Test Project Two", 
              set__client="Client One", 
              upsert=True) 

Fakat şu şekildedir: recommend alternative olduğu has been depreciated bu yöntem upsert=True ile update_one kullanmak için o Şimdi

{ 
    "name": "Test Project One", 
    "client": "Client One", 
    "code": "CL1-001", 
    "created": { 
     "$date": "2014-07-14T14:00:38.024Z" 
    } 
} 

Bu, created alanı olmadan koleksiyona eklenen bir belgede sonuçlanır:

{ 
    "client": "Client One", 
    "code": "CL1-002", 
    "name": "Test Project Two" 
} 

bir yarış durumu olmadan MongoEngine ile get_or_create varsayılan alan davranışını çoğaltmak için herhangi bir yolu var mı?

cevap

8

Bu şu anda otomatik olarak desteklenmiyor, ancak olabilir - lütfen bir bilet ekleyin ve bakıcılar gözden geçirebilir. o ekler ve bu ne gerekli çoğaltmak eğer arada

yalnızca bir değer ayarlar $setOnInsert kullanabilirsiniz örneğin:

Project.objects(code="CL1-002").update_one(set_on_insert__created=Project().created, 
              set__name="Test Project Two", 
              set__client="Client One", 
              upsert=True) 
İlgili konular