2014-07-14 4 views
5

glaube, ich habe eine Sammlung von Dokumenten definiert mit MongoEngine als:Mongoengine update_one + Upsert vs. auslaufend get_or_create

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) 

Historisch ich die get_or_create Methode verwendet haben könnte eine "insert oder update" Typ Operation auszuführen. Zum Beispiel:

Project.objects().get_or_create(name="Test Project One", 
           client="Client One", 
           code="CL1-001") 

Welche das folgende Dokument der Sammlung ergänzt:

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

Nun, da diese Methode has been depreciated die recommend alternative verwenden update_one mit upsert=True wie folgt:

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

Aber Dies führt dazu, dass der Sammlung ein Dokument ohne das Feld created hinzugefügt wird:

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

Gibt es eine Möglichkeit ist, das get_or_create Standard-Feldverhalten mit MongoEngine ohne Race-Bedingung zu replizieren?

Antwort

8

Dies wird derzeit nicht automatisch unterstützt, aber es könnte - fügen Sie bitte ein Ticket hinzu und die Betreuer können überprüfen.

In der Zwischenzeit können Sie $setOnInsert verwenden, die nur einen Wert setzt, wenn es einfügt und das wird replizieren was benötigt zB:

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