MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB c# récupère tous les éléments correspondants dans un tableau dans un document à l'aide du générateur de définition

La question ne décrit pas complètement le cas d'utilisation, j'ai donc proposé quelques options potentielles à explorer sur la base de quelques hypothèses, en particulier, elles dépendent de la disponibilité de LINQ et du ciblage d'un seul document à la fois ( et que vous ne voulez probablement pas plus de code que ce dont vous avez vraiment besoin) :

1) Une variation sur ce que vous avez. Utiliser une find standard avec une projection et une expression 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) Utilisez le pipeline d'agrégation (vous pouvez utiliser la même projection que ci-dessus)

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) Récupérez le document avec tous les éléments du tableau, puis filtrez localement à l'aide de LINQ. Sur le plan positif, il s'agit d'une petite quantité de code lisible, cependant, cela ramène le document entier avant le filtrage. Selon votre utilisation exacte, cela peut très bien être acceptable.

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

Si LINQ vraiment n'est pas une option alors il y a un exemple ici cela montre comment vous pouvez convertir la projection en pas nous LINQ. Totalement non testé mais serait quelque chose comme :

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);