Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

118
Vistas
Actualice una matriz anidada en Mongo con c #

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.

ingrese la descripción de la imagen aquí

ACTUALIZAR

OK, en lugar de empujar, necesitaba configurar. Y funcionó entonces.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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);
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda