Tengo la siguiente estructura en C# (un cliente con facturas). Estoy luchando para insertar en un registro mongodb existente. Estoy usando C# .NET 4.5 junto con MongoDB 2.4. Me gustaría insertar una nueva factura en un registro de cliente existente.
Recibo el error "error de clave duplicada" que entiendo, pero no sé cómo agregarlo al objeto Facturas dentro del objeto Cliente.
Cualquier ayuda muy apreciada.
Mi intento
var client = new MongoClient(); var database = client.GetDatabase("databasename"); var collection = database.GetCollection<Customer>("Customer"); var customerId = ".."; var builder = Builders<Customer>.Filter; var filter = builder.Eq("Id", new ObjectId(customerId)); var matchedRecord = collection.Find(filter).SingleOrDefault(); // Insert new invoice into the customer record matchedRecord.Invoices.Add(new Invoice { InvoiceNumber = "123456" }); collection.InsertOne(matchedRecord); // Error produced belowError
E11000 duplicate key error collection: databasename.Customer index: _id_ dup key: { : ObjectId('..') }Clases
public class Customer { public ObjectId Id { get; set; } public string CustomerId { get; set; } public List<Invoice> Invoices { get; set; } } public class Invoice { public string InvoiceNumber { get; set; } }Actualizar
var builder = Builders<Customer>.Filter; var filter = builder.Eq("Id", new ObjectId(customerId)); // Not sure how to use the FindOneAndUpdate method(?) var matchedRecord = collection.FindOneAndUpdate<Customer>(filter);Segunda actualización
Intenté lo siguiente pero inserta un nuevo objeto de factura (fuera de Facturas)
var builder = Builders<Customer>.Filter; var filter = builder.Eq("Id", new ObjectId(customerId)); var update = Builders<Customer>.Update.Set("Invoice.ClientName", "HELLO");Tercera actualización
Este enfoque sobrescribe las facturas existentes del cliente y las reemplaza con esta factura de "hola". ¿Cómo se puede anexar a las facturas existentes...?
var update = Builders<Customer>.Update .Set("Invoices", new Invoice { ClientName = "HELLO" }); var result = collection.UpdateOneAsync(filter, update);Esto funciona, observe el uso de Push; de lo contrario, es lo mismo que el enfoque establecido anterior (consulte la tercera actualización)
var update = Builders<Customer>.Update.Push("Invoices", new Invoice { ClientName = "HELLO" }); var result = collection.UpdateOneAsync(filter, update);