tengo un documento asi
{ "_id": "63dafa72f21d48312d8ca405", "tasks": [{ "_ref": "63d8d8d01beb0b606314e322", "data": { "values": [{ "key": "Deadline", "value": "2014-10-13" }] } }, { "_ref": "84dd046c6695e32322d842f5", "data": { "values": [] } }] }Ahora quiero actualizar el valor dentro de los valores que están dentro de los datos si el campo _ref coincide con mi entrada.
Mi código hasta ahora:
public bool updateProject(Project dbPro, Project pro) { var collection = db.GetCollection<BsonDocument>("projects"); var filter = Builders<BsonDocument>.Filter.Eq("_id", ObjectId.Parse( dbPro.Id)); var update = Builders<BsonDocument>.Update.AddToSetEach("tasks", pro.Tasks); var result = collection.UpdateOne(filter, update); if (result.IsModifiedCountAvailable) { if (result.ModifiedCount == 1) { return true; } } return false; }Por el momento, este código solo agrega los documentos como nuevas tareas en lugar de agregar los valores a las tareas coincidentes. ¿Quizás alguien tiene una idea de cómo lograr este comportamiento?
ACTUALIZAR
Lo probé como dijo @Shane Oborn. Pero todavía no me funciona.
var collection = db.GetCollection<BsonDocument>("projects"); var filter = Builders<BsonDocument>.Filter.Eq("_id", ObjectId.Parse( dbPro.Id)); var update = Builders<BsonDocument>.Update.Push("tags", buildBsonArrayFromTags(pro.Tags)); var result = collection.UpdateOne(filter, update); if (result.IsModifiedCountAvailable) { if (result.ModifiedCount == 1) { return true; } } return false; }En lugar de anular los datos, agrega una matriz a mi matriz.
ACTUALIZAR
OK, en lugar de empujar, necesitaba configurar. Y funcionó entonces.
No tengo el código exacto accesible, pero cerca. Tengo un método que realiza "upserts" (que "agrega" si es nuevo o "actualiza" si existe). Esto debería acercarte:
// The variable "doc" below is a BsonDocument var updateRequests = new List<WriteModel<BsonDocument>>(); updateRequests.Add(new ReplaceOneModel<BsonDocument>( CreateBsonDocumentFilterDefinition(filterKeyName, filterKeyValue), doc) { IsUpsert = true }); var writeResult = await collection.BulkWriteAsync(updateRequests);Los objetos clave aquí para usted son "ReplaceOneModel" y la propiedad "IsUpsert" para la definición del filtro.
¡Buena suerte!
ACTUALIZAR:
Otro método que tengo que hace actualizaciones en subdocumentos se ve así:
// Below, "subDocument" is a BsonDocument, and "subDocArrayName" is a string // that should match the name of the array that contains your sub-document // that will be updated. var collection = _database.GetCollection<BsonDocument>(collectionName); var builder = Builders<BsonDocument>.Update; var update = builder.Push(subDocArrayName, subDocument); await collection.UpdateOneAsync(CreateBsonDocumentFilterDefinition(filterKeyName, filterKeyValue), update);