sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB c # recupera todos los elementos coincidentes en una matriz dentro de un documento usando el generador de definiciones

La pregunta no describe completamente el caso de uso, por lo que se me ocurrieron algunas opciones potenciales para que explore en función de algunas suposiciones, en particular, dependen de que LINQ esté disponible y de que se dirija a un solo documento a la vez ( y que probablemente no quiera más código del que realmente necesita):

1) Una variación de lo que tienes. Usa un find estándar con proyección y expresión LINQ.

var projection = Builders<ShapeDocument>.Projection
    .Expression(x => x.fooArray.Where(y => y.plot == "circle"));

var items1 = collection
    .Find(x => x.user == "Jone Doe")
    .Project(projection)
    .ToList();

2) Use la canalización de agregación (podría usar la misma proyección que la anterior)

var pipeline = collection
    .Aggregate()
    .Match(x => x.user == "Jone Doe")
    .Project(i => new
            {
                x = i.fooArray.Where(x => x.plot == "circle")
            });

var items2 = pipeline.SingleOrDefault();

3) Retire el documento con todos los elementos de la matriz y luego filtre localmente usando LINQ. En el lado positivo, esta es una pequeña cantidad de código legible, sin embargo, recupera todo el documento antes de filtrarlo. Dependiendo de su uso exacto, esto puede ser aceptable.

var items3 = collection.AsQueryable()
    .SingleOrDefault(x => x.user == "Jone Doe")
    .fooArray.Where(x => x.plot == "circle");

Si LINQ realmente no es una opción, entonces hay un ejemplo aquí eso muestra cómo puede convertir la proyección a no nosotros LINQ. Totalmente no probado, pero sería algo así como:

var filter = new BsonDocument {
 {"input", "$items"},
 {"as", "item" },
 {"cond", new BsonDocument {
     // Fill in the condition values
     { "", new BsonArray { "", xxx } } }
   }
 };

var project = new BsonDocument {
 { "items", new BsonDocument { { "$filter", filter} } }
};

var pipeline = collection.Aggregate().Project(project);