es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Añade el documento raíz al array utilizando el controlador de Mongodb en C#.

¿Cuál sería el equivalente del comando “$push: ‘$$ROOT'” en una consulta de agregación, utilizando el controlador de MongoDB para C#? ¿Cuál sería el equivalente en C# de la siguiente consulta JSON (que contiene “$push: ‘$$ROOT'”) cuando se utiliza el controlador de MongoDB para C#, con la sintaxis de agregación fluida o LINQ (eventualmente utilizando el nuevo proveedor Linq3)?

db.getCollection('customers').aggregate(
[
  { $match:
     { $and:
     [
      { RegistrationDate: { $lte: ISODate('2021-12-13T23:59:59.999Z'), $gte: ISODate('2011-11-22T00:00:00.0Z') }},
      { $or:
        [
          { CountryOfResidence: 'France'},
          { CountryOfResidence: 'Spain'}
        ]
      },
      { Age: {$gte: '40'}}
     ]
     }
   },
   { $group: { _id: '$LastName', count: { $sum: 1 }, data: { $push: '$$ROOT' } } },
   { $match: { count: { $gte: 2 } } }, { $project: { count: 0 } }
])
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El comando equivalente a $push: '$$ROOT' en una consulta de agregación al utilizar el controlador de MongoDB en C# es utilizar el operador Push junto con la clase BsonDocument para representar el documento actual. El equivalente en C# de la consulta en json mencionada anteriormente sería:

    var filtro = Builders<bsondocument>.Filter.And(
        Builders<bsondocument>.Filter.Gte("FechaRegistro", new DateTime(2011, 11, 22)),
        Builders<bsondocument>.Filter.Lte("FechaRegistro", new DateTime(2021, 12, 13, 23, 59, 59, 999)),
        Builders<bsondocument>.Filter.Gte("Edad", 40),
        Builders<bsondocument>.Filter.Or(
            Builders<bsondocument>.Filter.Eq("PaisResidencia", "Francia"),
            Builders<bsondocument>.Filter.Eq("PaisResidencia", "España")
        )
    );
    
    var grupo = new BsonDocument{
        {"_id", "$Apellido"},
        {"cantidad", new BsonDocument("$sum", 1)},
        {"datos", new BsonDocument("$push", new BsonDocument("$root", "$$ROOT"))}
    };
    
    var proyecto = Builders<bsondocument>.Projection.Exclude("cantidad");
    
    var pipeline = Builders<bsondocument>.Pipeline
        .Match(filtro)
        .Group(grupo)
        .Match(new BsonDocument("cantidad", new BsonDocument("$gte", 2)))
        .Project(proyecto);
    
    var resultado = collection.Aggregate(pipeline).ToList();
    

    Alternativamente, también podemos utilizar la sintaxis de LINQ para la consulta anterior de la siguiente manera:

    var resultado = collection.AsQueryable()
        .Where(c =>
            c.FechaRegistro >= new DateTime(2011, 11, 22) &&
            c.FechaRegistro <= new DateTime(2021, 12, 13, 23, 59, 59, 999) &&
            c.Edad >= 40 &&
            (c.PaisResidencia == "Francia" || c.PaisResidencia == "España"))
        .GroupBy(c => c.Apellido,
            (clave, g) => new
            {
                _id = clave,
                cantidad = g.Count(),
                datos = g.Select(doc => BsonDocumentWrapper.Create(doc))
            })
        .Where(g => g.cantidad >= 2)
        .Select(g => new { g._id, g.datos })
        .ToList();
    

    En este caso, utilizamos BsonDocumentWrapper para crear un BsonDocument a partir del documento actual dentro de la declaración Select.

Comments are closed.