Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

295
Visualizações
Actualice el tipo de datos del campo para todos los documentos utilizando el controlador MongoDB C#

Estoy tratando de actualizar el tipo de datos de un campo de cadena a ObjectId para todos los documentos en una colección usando el controlador MongoDB C#. Esta consulta funciona perfectamente bien:

 db.getCollection('MyCollection').updateMany( { MyField: { $type: 2 } }, [{ $set: { MyField: { $toObjectId: "$MyField" } } }] );

Pero tengo problemas para escribir la misma consulta en C#. Probé la siguiente consulta usando UpdateManyAsync:

 var filter = new BsonDocument("MyField", new BsonDocument("$type", BsonType.String)); var update = new BsonDocument { { "$set", new BsonDocument("MyField", new BsonDocument("$toObjectId", "$MyField")) } }; var updateResult = await collection.UpdateManyAsync(filter, update);

Pero obtuve el siguiente error:

El campo con el prefijo dólar ($) '$toObjectId' en 'MyField.$toObjectId' no es válido para el almacenamiento

Este ejemplo aquí funciona, pero no es ideal porque me obliga a buscar todos los documentos:

 var updateList = new List<WriteModel<BsonDocument>>(); var documents = await collection.Find(Builders<BsonDocument>.Filter.Empty).ToListAsync(); foreach (var document in documents) { var id = document.GetElement("_id").Value.AsString; var myFieldValue = document.GetElement("MyField").Value.AsString; var filter = Builders<BsonDocument>.Filter.Eq("_id", id); var update = Builders<BsonDocument>.Update.Set("MyField", new BsonObjectId(ObjectId.Parse(myFieldValue))); updateList.Add(new UpdateOneModel<BsonDocument>(filter, update)); } if (updateList.Any()) { var bulkWriteResult = await collection.BulkWriteAsync(updateList); }
over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Mira esto:

 var pipeline = Builders<BsonDocument> .Update .Pipeline(new EmptyPipelineDefinition<BsonDocument>() .AppendStage<BsonDocument, BsonDocument, BsonDocument>("{ $set: { MyField: { $toObjectId: '$MyField' } } }")); coll.UpdateMany( new BsonDocument("MyField", new BsonDocument("$type", BsonType.String)), pipeline);
over 4 years ago · Santiago Trujillo Relatório

0

Este ejemplo de código funciona:

 var filter = new BsonDocument("MyField", new BsonDocument("$type", BsonType.String)); var stage = new BsonDocument { { "$set", new BsonDocument { { "MyField", new BsonDocument { { "$toObjectId", "$MyField" } } } } } }; var pipeline = PipelineDefinition<BsonDocument, BsonDocument>.Create(stage); var update = Builders<BsonDocument>.Update.Pipeline(pipeline); var result = await collection.UpdateManyAsync(filter, update);

Muchas gracias @kanils_ me indicó la dirección correcta, este ejemplo de agregación C# del controlador Mongo Db para la actualización también me ayudó a escribir el código anterior. También muchas gracias @dododo por tu sugerencia.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda