2012-02-22 18 views
5

Usando MongoDB y el último controlador 10gen C# (CSharpDriver-1.3.1.4349), estoy tratando de hacer una actualización "en el lugar" y recuperar el número de documentos efectuados en el resultado.SafeModeResult es nulo después de la actualización

public static long SaveListings(string state, bool isActive, DateTime updateDate) 
{ 
    var result = Collection().Update(
    Query.And(
     Query.EQ("State", state), 
     Query.And(
      Query.EQ("IsActive", isActive), 
      Query.LT("UpdateDate", updateDate))), 
    Update.Set("IsActive", false), UpdateFlags.Multi); 
    return result != null ? result.DocumentsAffected : -1; 
} 

El resultado es nulo por alguna razón. Si yo estuviera haciendo esto desde la consola, podría obtener el número de filas efectuada por hacer esto:

db.Listing.update({ State: state.Abbreviation, IsActive: true, UpdateDate: { $lt: expiredDate } }, { $set: { IsActive: false } }, false, true); 
var numRows = db.getLastErrorObj().n; 

Alguna idea de lo que estoy haciendo mal o se trata de un error en el controlador C#?

Respuesta

6

La actualización contiene un método sobrecargado que toma SafeMode. Sólo tiene que añadir a su código como cuarto parámetro a su actualización y debe ser no nulo:

... 
UpdateFlags.Multi, 
SafeMode.True); 

Eso no es error de controlador, que funciona como se espera. Mongodb no espera el documento si se inserta sin modo seguro (por lo tanto, el controlador devuelve nulo), pero si dice SafeMode = true - fuerza a mongodb a esperar hasta que se inserte el documento.

+0

¡Gracias! Sé cómo funciona el modo seguro, pero asumí incorrectamente que la conexión usaría el modo seguro por defecto. – Justin

+0

Tuve el mismo problema, tenga en cuenta que el controlador actual tiene problemas con la autenticación al usar getLastError explícitamente. Robert (desarrollador en 10gen) recomendando utilizar SafeMode.True en su lugar hasta que se resuelva el problema. ver https://jira.mongodb.org/browse/CSHARP-390 – sambomartin

4

Hacer inserciones y actualizaciones sin especificar el modo seguro produce nulo porque son operaciones asíncronas; simplemente no hay forma de saber cómo fue la inserción o la actualización.

Por lo tanto, agregue p. SafeMode.True como el último argumento en inserciones y actualizaciones en los casos en que usted se preocupa por el resultado. Esto hará que el problema de controladores de un comando getLastError, que bloquea hasta que se ha completado la inserción/actualización:

var result = collection.Update(query, update, SafeMode.True); 

Usted puede leer algunos seguros más sobre getLastError y diferentes modos here (general) y here (SafeMode with the C# driver).

Cuestiones relacionadas