MongoDB C# Controlador 2.0 – documento de Actualización

Actualmente estoy actualizando mi código de MongoDB C# controlador 2.0 y estoy teniendo problemas para actualizar el código de actualización de documentos.

utilizando la versión anterior yo era capaz de hacer algo como esto:

MyType myObject; //passed in 
var collection = _database.GetCollection<MyType>("myTypes");
var result = collection.Save(myObject);

Estoy luchando por encontrar una manera de hacer esto en la nueva versión.
He encontrado un par de ejemplos de la actualización de los campos individuales como

var filter = Builders<MyType>.Filter.Eq(s => s.Id, id);
var update = Builders<MyType>.Update.Set(s => s.Description, description);
var result = await collection.UpdateOneAsync(filter, update);

Me gustaría actualizar todos los campos, como se estaba haciendo en la versión antigua con el método de Guardar.

Alguna idea ?

Muchas gracias

  • retirar la mongodb contenedor de la biblioteca MongoDB.Entidades. la actualización de una entidad es tan simple como: var author = DB.Find<Author>("ObjectId"); author.Name = "Charles Dickens"; author.Save();

3 Kommentare

  1. 26

    Creo que usted está buscando ReplaceOneAsync():

    MyType myObject; //passed in 
    var filter = Builders<MyType>.Filter.Eq(s => s.Id, id);
    var result = await collection.ReplaceOneAsync(filter, myObject)
    • Gracias mnemosyn ! Yo estaba a punto de publicar mi propia respuesta como acabo de encontrar la ReplaceOneAsync hace unos minutos. Gracias de todos modos eso es exactamente lo que yo necesitaba !
    • Donde se obtendrá el valor de «id» de?
    • Creo que es mejor si usted trabaja con BsonDocument en lugar de MyType. Si MyType ha BsonIgnoreExtraFields bandera, el documento se ignoran los campos que no están representadas en MyType clase. En el método insert, método sólo insertar campos que existe en la clase y perderá todos los otros nonrepresented campos.
    • Por otro lado, otros decoradores será ignorado… En cualquier caso, necesita algún tipo de invariantes de cheques, de preferencia en el código objeto en mi humilde opinión. Pero el OP pregunta no era sobre los pros y los contras de las diferentes estrategias de migración, que es más complejo el tema, me temo.
  2. 25

    Para agregar a mnemosyn la respuesta, mientras que un simple ReplaceOneAsync hace la actualización de un documento no es equivalente a Save como Save también insertar el documento, si no se encuentra uno de actualizar.

    Para lograr el mismo comportamiento con ReplaceOneAsync que usted necesita para utilizar las opciones de parámetro:

    MyType myObject; 
    var result = await collection.ReplaceOneAsync(
        item => item.Id == id, 
        myObject, 
        new UpdateOptions {IsUpsert = true});
    • ¿Qué versión de controlador están con usted? He tratado de 2.01 y 2.2.2. Hay opciones de update no está permitido. Requeridos tipo de opción es «FindOneAndReplaceOptions<MyType, TProjection>». No tengo ni idea de cómo cree que con un IsUpsert configuración.
    • Mi código de llamadas ReplaceOneAsync. está usted seguro de que no está llamando a FindOneAndReplaceAsync?
    • Aaaah, aquí estamos!!!! Es viernes por la tarde aquí. Necesito tomar freno … muchas Gracias 🙂
    • Hay alguna forma de lograr lo mismo sin cambiar el documento de IDENTIFICACIÓN? Por lo mismo, me refiero a hacer un simple Idempotente «Upsert» de la operación, proporcionando una nueva versión del documento sin necesidad de especificar los campos que han cambiado.
    • esto no cambia el id de documento
  3. 3

    puede usar LINQ como la siguiente:

    await context.collection.ReplaceOneAsync(b=> b.Id == item.Id,item);

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea