2011-11-21 20 views
6

De la documentación C#:MongoDB C# collection.Save vs Insert + Actualización

El método Save es una combinación de inserción y actualización. Si el miembro Id del documento tiene un valor, se supone que es un documento existente y Guardar actualización de llamadas en el documento (estableciendo el indicador Upsert justo en caso de que en realidad sea un documento nuevo después de todo).

Estoy creando mis ID manualmente en una clase base de la que todos mis objetos de dominio heredan. Entonces, todos mis objetos de dominio tienen una ID cuando se insertan en MongoDB.

Las preguntas son, ¿debería usar la colección.Guardar y mantener mi interfaz simple o esto realmente da como resultado una sobrecarga en el Save-call (con el indicador Upsert), y en ese caso debo usar la colección.Insertar y actualizar en su lugar?

Lo que estoy pensando es que el método Save primero llama a Update y luego se da cuenta de que mi nuevo objeto no existía en primer lugar, y luego llama a Insert. ¿Me equivoco? ¿Alguien ha probado esto?

Nota: Inserto datos a granel con InsertBatch, por lo que las grandes copias de datos no importan en este caso.

Editar, Seguimiento

escribí una pequeña prueba para averiguar si llama con la bandera de actualización de Upsert tenía cierta sobrecarga de modo Insertar podría ser mejor. Resultó que corren a la misma velocidad. Vea mi código de prueba a continuación. MongoDbServer e IMongoDbServer es mi propia interfaz genérica para aislar la instalación de almacenamiento.

IMongoDbServer server = new MongoDbServer(); 
Stopwatch sw = new Stopwatch(); 
long d1 = 0; 
long d2 = 0; 
for (int w = 0; w <= 100; w++) 
{ 
    sw.Restart(); 
    for (int i = 0; i <= 10000; i++) 
    { 
     ProductionArea area = new ProductionArea(); 
     server.Save(area); 
    } 
    sw.Stop(); 
    d1 += sw.ElapsedMilliseconds; 
    sw.Restart(); 
    for (int i = 0; i <= 10000; i++) 
    { 
     ProductionArea area = new ProductionArea(); 
     server.Insert(area); 
    } 
    sw.Stop(); 
    d2 += sw.ElapsedMilliseconds; 
} 
long a1 = d1/100; 
long a2 = d2/100; 

Respuesta

12

El método Save es no va a hacer dos viajes al servidor.

La heurística es esta: si el documento que se está guardando no tiene un valor para el campo _id, se genera un valor para él y luego se invoca a Insertar. Si el documento que se está guardando tiene un valor distinto de cero para _id, entonces se llama a Update con el indicador Upsert, en cuyo caso depende del servidor decidir si hacer una inserción o una actualización.

No sé si un Upsert es más caro que un inserto. Sospecho que son casi lo mismo y lo que realmente importa es que, en cualquier caso, se trata de una ida y vuelta de red única.

Si sabe que es un documento nuevo, también puede llamar a Insertar. Y llamar a InsertBatch es manera más eficaz que llamar a muchos Inserts individuales. Así que definitivamente prefiero InsertBatch para guardar.

Cuestiones relacionadas